8

DelegatingHandlerのSendAsyncメソッドで実行中の(または実行されようとしている)コントローラーにアクセスできるかどうか疑問に思いましたか?アクセス方法がわからないようですが、コントローラーの実行外で実行されているためだと思います...

参照することはできますか?

4

3 に答える 3

18

いいえ、メッセージハンドラーはrawHttpRequestMessageまたはraw HttpResponseMessage(継続の場合)で動作するためです。したがって、実際には、メッセージハンドラーは、要求をコントローラーにディスパッチする前、または(継続の場合は)コントローラーが応答を返した後に呼び出されるため、「現在のコントローラーの実行」の概念はありません。DelegatingHandlers

しかし、それは本当にあなたがやろうとしていることに依存します。

リクエストが最終的にどのコントローラーにルーティングされるかを知りたい場合は、コントローラーを内部的に選択するメカニズムを手動で呼び出すことができます。

public class MyHandler : DelegatingHandler
{
    protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        var config = GlobalConfiguration.Configuration;
        var controllerSelector = new DefaultHttpControllerSelector(config);

        // descriptor here will contain information about the controller to which the request will be routed. If it's null (i.e. controller not found), it will throw an exception
        var descriptor = controllerSelector.SelectController(request);

        // continue
        return base.SendAsync(request, cancellationToken);
    }
}
于 2012-10-20T01:56:33.583 に答える
3

@GalacticBoyソリューションを拡張するには、

public class MyHandler : DelegatingHandler
{
    private static IHttpControllerSelector _controllerSelector = null;

    protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        if (_controllerSelector == null)
        {
            var config = request.GetConfiguration();
            _controllerSelector = config.Services.GetService(typeof(IHttpControllerSelector)) as IHttpControllerSelector;
        }

        try
        {
            // descriptor here will contain information about the controller to which the request will be routed. If it's null (i.e. controller not found), it will throw an exception
            var descriptor = _controllerSelector.SelectController(request);


        }
        catch
        {
            // controller not found
        }

        // continue
        return base.SendAsync(request, cancellationToken);
    }
}
于 2017-06-07T14:22:34.583 に答える
0

情報をどのように処理しているかによっては、リクエストの実行後に情報を取得しても問題ない場合があります。たとえば、実行されたコントローラ/アクションをログに記録します。

using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Web;

namespace Example
{
    public class SampleHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            return base.SendAsync(request, cancellationToken)
                       .ContinueWith(task =>
                       {
                           HttpResponseMessage response = task.Result;

                           string actionName = request.GetActionDescriptor().ActionName;
                           string controllerName = request.GetActionDescriptor().ControllerDescriptor.ControllerName;

                            // log action/controller or do something else

                           return response;
                       }, cancellationToken);
        }
    }
}
于 2018-01-26T15:26:36.067 に答える