.NET Web API MessageHandler计时

时间:2012-09-05 21:39:15

标签: c# .net authentication asp.net-web-api

使用Thinktecture.IdentityModel.40 library(用于.NET的Web API中的身份验证)时出现了这个问题,但它似乎更普遍地适用于MessageHandlers / DelegateHandlers。 AuthenticationHandler类的SendAsync(..)函数使用ContinueWith(..)调用修改Web API的响应:

return base.SendAsync(request, cancellationToken).ContinueWith(
    (task) => {
        var response = task.Result;

        if (response.StatusCode == HttpStatusCode.Unauthorized) {
            SetAuthenticateHeader(response);
        }

        return response;
    }
);

REFERENCE

对Web API的第一个请求正常工作。所有后续请求都会超时使用Fiddler,在第一次请求之后绝对没有收到任何响应。我认为这可能是一个缓存问题,所以我添加了几个标题:

Cache-Control: no-cache
Pragma: no-cache
Expires: -1

但这些没有效果。如果我将代码更新为:

return base.SendAsync(request, cancellationToken).ContinueWith(
    (task) => {
        ..
    }
    , TaskContinuationOptions.ExecuteSynchronously
);

然后问题就解决了。

我已经读过在Global.asax中应用配置的顺序会影响MessageHandlers。我已经尝试重新安排这些,但这似乎没有任何影响:

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector), new AreaHttpControllerSelector(GlobalConfiguration.Configuration));

XmlConfigurator.Configure();//Applies Log4Net configuration
AreaRegistration.RegisterAllAreas();

AuthenticationConfig.ConfigureGlobal(GlobalConfiguration.Configuration);//Applies Thinktecture's AuthenticationHandler
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);

Bootstrapper.Initialise();//Applies dependency injection

目前我有一个解决方案,但它并不令人满意,因为我不明白问题的原因。我错过了一些明显的东西吗?

感谢。

0 个答案:

没有答案