DelegatingHandlerのSendAsyncメソッドで実行中の(または実行されようとしている)コントローラーにアクセスできるかどうか疑問に思いましたか?アクセス方法がわからないようですが、コントローラーの実行外で実行されているためだと思います...
参照することはできますか?
DelegatingHandlerのSendAsyncメソッドで実行中の(または実行されようとしている)コントローラーにアクセスできるかどうか疑問に思いましたか?アクセス方法がわからないようですが、コントローラーの実行外で実行されているためだと思います...
参照することはできますか?
いいえ、メッセージハンドラーは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);
}
}
@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);
}
}
情報をどのように処理しているかによっては、リクエストの実行後に情報を取得しても問題ない場合があります。たとえば、実行されたコントローラ/アクションをログに記録します。
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);
}
}
}