2

这个问题在使用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

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

谢谢。

4

0 回答 0