Web API DelegatingHandler Async HttpContext = null错误

时间:2013-04-25 17:58:30

标签: .net asp.net-web-api async-await httpcontext

我有一个非常奇怪的错误,只有在我有某个DelegatingHandler拦截调用时才会弹出我的应用程序。它的要点是,当请求通过我的DelegatingHandler时,HttpContext.Current对于Web服务器仅接收的第一个请求。因此,如果我是第一个在部署代码后点击我的API的人,我就会收到错误消息。否则,我很酷。

以下是错误发生的概述:

  1. 请求进入委托处理程序
  2. 处理程序遍历整个SendAsync函数,并通过调用return await base.SendAsync(request, cancellationToken);
  3. 结束
  4. WebAPI依赖项解析器(我使用simpleinjector)尝试解析APIController的依赖关系
  5. 依赖项解析失败,因为HttpContext.Current为空(尝试HttpContext.Current.ItemsIUnitOfWork
  6. 所以看起来线程关联/上下文只在我的处理程序中被更改?我不明白。调用堆栈始终显示错误(HttpContext为null)在最终await base.SendAsync(request, cancellationToken);内发生。奇怪。

    这是处理程序代码:

    public class RecipeIdValidator:DelegatingHandler
    {
    
        private static string[] _Ignore = new string[] {"api/webhook" };
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            if(_Ignore.Any(i=>request.RequestUri.AbsoluteUri.IndexOf(i)!=-1))
                return await base.SendAsync(request, cancellationToken);
    
    
            var recipeId = request.GetQueryNameValuePairs().Where(i=>i.Key.Equals("recipeid",StringComparison.InvariantCultureIgnoreCase));
    
            if (!recipeId.Any())
                return request.CreateErrorResponse(System.Net.HttpStatusCode.Forbidden,"Missing recipeId/api key. Please add this to your request in the form of the querystring ?recipeId=value.");
    
    
            CheckValidity(recipeId);
    
    
            return await base.SendAsync(request, cancellationToken);
        }
    }
    

0 个答案:

没有答案