Tag: asp.net web api

HttpClient爬网导致内存泄漏

我正在进行WebCrawler 实现,但在ASP.NET Web API的HttpClient中遇到了奇怪的内存泄漏。 所以减少版本在这里: [更新2] 我发现了问题,并没有HttpClient泄漏。 看到我的回答。 [更新1] 我添加了dispose没有效果: static void Main(string[] args) { int waiting = 0; const int MaxWaiting = 100; var httpClient = new HttpClient(); foreach (var link in File.ReadAllLines(“links.txt”)) { while (waiting>=MaxWaiting) { Thread.Sleep(1000); Console.WriteLine(“Waiting …”); } httpClient.GetAsync(link) .ContinueWith(t => { try { var httpResponseMessage = t.Result; if (httpResponseMessage.IsSuccessStatusCode) httpResponseMessage.Content.LoadIntoBufferAsync() […]

如何正确映射WebAPI路由

我正在使用Web API为类似Twitter的网站构建API,并且无法映射路由 我对User控制器有以下操作: public User Get(string firstname, string lastname) public User Get(Guid id) public User Friends(Guid id) public User Followers(Guid id) public User Favorites(Guid id) 所需的路由和生成的文档应该是: api/users?firstname={firstname}&lastname={lastname} api/users/{id} api/users/{id}/friends api/users/{id}/followers api/users/{id}/favorites 在WebApiConfig.cs中我有: config.Routes.MapHttpRoute( “2”, “api/{controller}/{id}”, new { action = “get”, id = RouteParameter.Optional } ); config.Routes.MapHttpRoute( “1”, “api/{controller}/{id}/{action}” ); 如何正确映射WebAPI路由?

为什么缓存访问令牌在oauth2中被认为是错误的?

我正在关注此文章以撤消用户访问权限: Enable OAuth Refresh Tokens in AngularJS App using ASP .NET Web API 2, and Owin 现在考虑validation用户后我已经发布了一个30分钟的生命周期的accessstoken,如上文所示,并且刷新令牌为1天,但如果管理员在10分钟内删除该用户20分钟仍然如此,那么现在我需要撤消该用户的访问权限。 为了做到这一点,我需要从刷新令牌表中删除该用户条目以禁止进一步的访问令牌请求,但由于accessstoken到期时间仍然是20分钟,因此用户将能够访问完全错误的受保护资源。 所以我想实现缓存机制来缓存服务器上的访问令牌并保存在数据库中 。 因此,当该用户被撤销时,我可以简单地从缓存和数据库中删除该用户条目,以阻止该用户访问访问受保护资源。 但是下面这两个答案说这不是oauth2的设计方式: 撤消OAuthBearerAuthentication的访问令牌 OAuth2 – 刷新令牌不必要的复杂性 所以我的问题是: 1)为什么缓存访问令牌不被认为比刷新令牌机制更好,也是一种糟糕的方法? 我的第二个问题是基于@Hans Z给出的以下答案,其中他说: 这必然涉及资源服务器(RS)咨询授权服务器(AS),这是一个巨大的开销。 2)如果撤销用户的访问权限,为什么RS会咨询AS,因为AS仅用于validation用户并根据本文生成访问令牌? 3)在文章中只有2个项目: Authentication.api – validation用户并生成访问令牌 资源服务器 – 借助[Authorize]属性validationaccesstoken 在上述情况下,授权服务器呢? 更新:我决定使用刷新令牌撤消用户访问以防用户被删除,并且当用户注销时我将刷新令牌刷新令牌表因为您要求我们在用户点击注销后立即注销用户。 但这里的问题是我有250个与用户相关的角色,所以如果我把角色放在accesstoken中,那么accesstoken的大小将是如此巨大,我们无法从头部传递如此巨大的accessstoken但我无法查询角色以validation每次端点的用户访问权限调用端点。 所以这是我面临的另一个问题。

如何在Azure上的Application Insights中将exception链接到请求?

我们在Azure上使用Owin来提供REST服务,并且必须直接向Application Insights报告。 我们想记录exception和请求。 现在我们有这个: using AppFunc = Func<IDictionary, Task>; public class InsightsReportMiddleware { readonly AppFunc next; readonly TelemetryClient telemetryClient; public InsightsReportMiddleware(AppFunc next, TelemetryClient telemetryClient) { if (next == null) { throw new ArgumentNullException(“next”); } this.telemetryClient = telemetryClient; this.next = next; } public async Task Invoke(IDictionary environment) { var sw = new Stopwatch(); sw.Start(); await next(environment); […]

在内存中缓存应用程序数据:MVC Web API

我正在编写一个MVC webAPI,它将用于返回将绑定到下拉框的值或在网站上用作提前输入文本框结果的值,我想在内存中缓存值,这样我就不需要执行数据库请求每次API被击中。 我将使用MemoryCache类,我知道我可以在第一个请求进入时填充缓存,但我不希望API的第一个请求比其他请求慢。 我的问题是:在WebAPI首次启动时,我有没有办法自动填充缓存? 我看到有一个“App_Start”文件夹,也许我只是在这里扔东西? 在初始填充之后,我可能会按小时/每日运行请求以根据需要更新缓存。 MemoryCache: http : //msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx UDPATE Ela在下面的回答就是这个伎俩,基本上我只需要看看Global.asax的function。 感谢您在这里的快速帮助,这为我提出了一个单独的问题,关于不同缓存类型的优缺点。 不同ASP.NET缓存选项的优缺点

Azure Service Fabric Actors – 未处理的exception?

现在我们的ASF集群正在运行: Web API项目 – 无状态和面向公众 Actor项目 – 主要是volatile,将数据保存在内存中,由某些API使用 我们正在尝试Application Insights,我可以设置未处理的错误跟踪,就像他们的文档对我们的Web API项目一样。 问题是,我希望这也适用于我们的Actor项目。 是否存在捕捉Actor内未处理错误的全局位置? 我知道这是新的,也许这就是为什么我找不到这方面的文件。 现在我在每个actor方法中都这样做,但似乎不是一个很好的解决方案: public async Task DoStuff() { try { //Do all my stuff } catch (Exception exc) { //Send to Windows Event Source ActorEventSource.Current.ActorMessage(this, “Unhandled error in {0}: {1}”, nameof(DoStuff), exc); //Send to Application Insights new TelemetryClient().TrackException(exc); throw exc; } }

何时返回IHttpActionResult vs Object

在使用ASP.NET Web API的示例中,我看到两种不同的方法用于将数据返回到调用jQuery函数。 第一种方法返回Client类型的对象,但我不确定第二种方法返回的是什么。 方法#1 (返回Client对象) public IEnumerable GetAllClients() { using (var context = new PQRSModel.PQRSEntities()) { context.Configuration.ProxyCreationEnabled = false; var query = context.Clients.OrderBy(c = c.OrgName); var customers = query.ToList(); return customers; } } 方法#2 ( IHttpActionResult提供什么好处?) public IHttpActionResult GetClient(int clientId) { using (var context = new PQRSModel.PQRSEntities()) { context.Configuration.ProxyCreationEnabled = false; var client = […]

使用WebAPI流式传输大型文件(超过IIS 2GB)

我正在尝试将非常大的文件(> 2GB)上传到我的WebAPI应用程序(在.NET 4.5.2上运行,Windows 2012R2)。 设置httpRuntime maxRequestLength属性是没有用的,因为它只能处理小于2GB的文件。 我目前正在使用自定义的MultipartFormDataStreamProvider来读取服务器上的整个流,并且我已经使用自定义WebHostBufferPolicySelector关闭了缓冲。 我发现ASP.NET(或WebAPI)使用Hood下的HttpBufferlessInputStream,它有一个名为_disableMaxRequestLength的字段。 如果我将此值设置为true(通过reflection),我可以流式传输任何大小的文件。 然而,摆弄这些内部的这些显然不是一个好方法。 用于请求的HttpRequest类有一个名为GetBufferlessInputStream的方法,该方法具有允许禁用maxRequestLength的重载。 我的问题是:如何让WebAPI使用此重载而不是标准的重载? 有没有办法替换Default HttpRequest或HttpContext类? 或者我真的需要使用reflection来完成整个过程吗? 这是我目前用来禁用maxRequestLength的代码: private void DisableRequestLengthOnStream(HttpContent parent) { var streamContentProperty = parent.GetType().GetProperty(“StreamContent”, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); if (streamContentProperty == null) return; var streamContent = streamContentProperty.GetValue(parent, null); if (streamContent == null) return; var contentProperty = typeof(StreamContent).GetField(“content”, BindingFlags.Instance | BindingFlags.NonPublic); if (contentProperty == […]

使用ASP.Net MVC 4 Web API和Ninject.Web.WebApi发布问题

我正在尝试将新的ASP.Net MVC 4 Web API项目模板与Ninject一起使用,但是在以下错误中遇到了障碍: 程序集’Ninject.Web.WebApi.Filter.DefaultFilterProvider’中的方法’GetFilters’来自程序集’Ninject.Web.WebApi,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = c7192dc5380945e7’没有实现。 我正在使用ASP.Net MVC 4 – > Web API模板在Visual Studio 2010中创建一个全新的项目,我正在使用最新的Ninject NuGet包: Ninject 3.0.1.10 Ninject.Web.Common 3.0.0.7 Ninject.Web.WebApi 3.0.0.2 我尝试过在这个问题中提出的解决方案,但是我没有运气 – 如果我删除对Ninject.Web.WebApi的引用,那么MVC永远不会使用Ninject。 我也注意到他们提到了Ninject.MVC3但是我使用的是新的Ninject.WebApi插件。 我正在使用NinjectWebCommon.cs中的默认绑定代码,该代码是在NuGet安装期间创建的,并尝试在RegisterServices()中注册一个简单服务 [assembly: WebActivator.PreApplicationStartMethod(typeof(mkts.web.App_Start.NinjectWebCommon), “Start”)] [assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(mkts.web.App_Start.NinjectWebCommon), “Stop”)] namespace mkts.web.App_Start { using System; using System.Web; using Microsoft.Web.Infrastructure.DynamicModuleHelper; using Ninject; using Ninject.Web.Common; using mkts.service; public […]

关于ASP.NET表单身份validation和会话的滑动到期

我们有一个使用本机表单身份validation和会话function的ASP.NET 4.5 WebForms应用程序。 滑动到期时两者都超时20分钟。 想象一下以下场景。 用户已经在我们的应用程序中工作了一段时间,然后继续做其他事情,让我们的应用程序闲置20分钟。 然后,用户返回我们的应用程序以编写报告。 但是,当用户尝试保存时,他/她将使用登录屏幕进行处理,并且报告将丢失。 显然,这是不需要的。 我们希望在身份validation或会话过期时将浏览器重定向到登录页面,而不是这种情况。 为了实现这一点,我们构建了一个Web Api服务,可以调用它来检查是否是这种情况。 public class SessionIsActiveController : ApiController { /// /// Gets a value defining whether the session that belongs with the current HTTP request is still active or not. /// /// True if the session, that belongs with the current HTTP request, is still active; […]