使用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;
}
);
对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
目前我有一个解决方案,但它并不令人满意,因为我不明白问题的原因。我错过了一些明显的东西吗?
感谢。