mat*_*ole 14 asp.net asp.net-web-api
我能够在global.asax.cs中为Web API路由ala成功注册一个自定义路由处理程序(从IRouteHandler派生):
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{client}/api/1.0/{controller}/{action}/{id}",
defaults: new{id = UrlParameter.Optional}
).RouteHandler = new SingleActionAPIRouteHandler();
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试为集成测试设置内存主机时,我似乎无法找到一种方法,当我调用HttpConfiguration.Routes.MapRoute时,我无法在返回的IHttpRoute上设置处理程序.
我应该采用不同的方式(例如使用自定义的HttpControllerSelector)吗?在两种情况下,我显然都喜欢这样做.
谢谢,马特
编辑:
所以我最终做的基本上是遵循下面的建议,但只是重写HttpControllerDispatcher类,如下所示:
public class CustomHttpControllerDispatcher : HttpControllerDispatcher
{
public CustomHttpControllerDispatcher(HttpConfiguration configuration) : base(configuration)
{
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// My stuff here
return base.SendAsync(request, cancellationToken);
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*nes 13
你是对的.自托管返回IHttpRoute并将HttpMessageHandler作为参数.似乎没有内置的方式来特定路由处理程序.
更新:要更清楚一点
你几乎肯定应该使用HttpControllerSelector并实现一个自定义的...一个例子.http://netmvc.blogspot.co.uk/
接下来是一些实验,如果HttpControllerSelector不足以满足你的要求......
但是,你可以看到MapHttpRoute
它有一个重载,HttpMessageHandler
所以你可以试验这个... 如果处理程序是NULL然后它默认为IHttpController但你可以实现自己的,并使用它来指向正确的控制器... MVC框架似乎在[HttpControllerDispatcher]
这里使用,所以借用一些代码你可以在这里放置你自己的控制器/路由选择代码 - 你可以访问路由和选择器,并可以自己交换它.
此CustomHttpControllerDispatcher代码仅用于DEMO ...查找该行
//请务必在此处挑选您的控制器
也许玩一玩......
示例路线:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: null,
handler: new CustomHttpControllerDispatcher(config)
);
Run Code Online (Sandbox Code Playgroud)
示例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);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18716 次 |
最近记录: |