这个问题在使用Thinktecture.IdentityModel.40 库(用于 .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
目前我有一个解决方案,但并不令人满意,因为我不明白问题的原因。我错过了一些明显的东西吗?
谢谢。