この質問は、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
現時点では解決策がありますが、問題の原因がわからないため、満足のいくものではありません。明らかな何かが欠けていますか?
ありがとう。