あなたは非常に正しいです。セルフ ホストは IHttpRoute を返し、HttpMessageHandler をパラメーターとして受け取ります。ルート ハンドラを特定する組み込みの方法はないようです。
更新:もう少し明確にするために
ほとんどの場合、HttpControllerSelector を使用してカスタムのものを実装する必要があります... 例を次に示します。http://netmvc.blogspot.co.uk/
以下は、何らかの理由で HttpControllerSelector が要件を満たしていない場合のちょっとした実験です...
しかし、ご覧のとおり、 にMapHttpRoute
はオーバーロードがあるHttpMessageHandler
ため、これを試すことができます...ハンドラーが NULL の場合、デフォルトで IHttpController になりますが、独自に実装し、これを使用して正しいコントローラーに転送することができます... MVC フレームワークは[HttpControllerDispatcher]
hereを使用しているように見えるので、いくつかのコードを借りて、独自のコントローラー/ルート選択コードをここにも配置できます。ルートとセレクターにアクセスでき、自分で交換できます。
この CustomHttpControllerDispatcher コードはデモ専用です...行を探します
//コントローラーを選択するためにここで何かカスタムを行います
そして、おそらくそれで遊んでください...
ルート例:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: null,
handler: new CustomHttpControllerDispatcher(config)
);
CustomHttpControllerDispatcher の例:
public class CustomHttpControllerDispatcher : HttpMessageHandler
{
private IHttpControllerSelector _controllerSelector;
private readonly HttpConfiguration _configuration;
public CustomHttpControllerDispatcher(HttpConfiguration configuration)
{
_configuration = configuration;
}
public HttpConfiguration Configuration
{
get { return _configuration; }
}
private IHttpControllerSelector ControllerSelector
{
get
{
if (_controllerSelector == null)
{
_controllerSelector = _configuration.Services.GetHttpControllerSelector();
}
return _controllerSelector;
}
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return SendAsyncInternal(request, cancellationToken);
}
private Task<HttpResponseMessage> SendAsyncInternal(HttpRequestMessage request, CancellationToken cancellationToken)
{
IHttpRouteData routeData = request.GetRouteData();
Contract.Assert(routeData != null);
//DO SOMETHING CUSTOM HERE TO PICK YOUR CONTROLLER
HttpControllerDescriptor httpControllerDescriptor = ControllerSelector.SelectController(request);
IHttpController httpController = httpControllerDescriptor.CreateController(request);
// Create context
HttpControllerContext controllerContext = new HttpControllerContext(_configuration, routeData, request);
controllerContext.Controller = httpController;
controllerContext.ControllerDescriptor = httpControllerDescriptor;
return httpController.ExecuteAsync(controllerContext, cancellationToken);
}
}