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