ASP.Net WebAPI中的自定义路由处理程序
我可以成功地注册一个自定义路由处理程序(派生自IRouteHandler)在global.asax.cs内的一个Web API路由ala:
routes.MapHttpRoute( name: "DefaultApi",routeTemplate: "{client}/api/1.0/{controller}/{action}/{id}",defaults: new{id = UrlParameter.Optional} ).RouteHandler = new SingleActionAPIRouteHandler(); 但是,当我调用HttpConfiguration.Routes.MapRoute我无法在返回的IHttpRoute上设置一个处理程序时,我试图在内存主机中设置API进行集成测试时似乎找不到一种方法. 我应该做的不同(例如通过使用自定义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); } } 解决方法
你是对的自主主机返回IHttpRoute,并将HttpMessageHandler作为参数.似乎没有内置的路由处理程序的特定方式.
更新:更清楚一点 你应该几乎肯定会使用HttpControllerSelector并实现一个自定义的…一个例子是. http://netmvc.blogspot.co.uk/ 以下是一些实验,如果HttpControllerSelector不足以满足您的要求,什么原因… 但是,正如你可以看到MapHttpRoute对HttpMessageHandler有一个重载,所以你可以试试这个… if the handler is NULL then it defaults to IHttpController,但你可以实现自己的,并使用它来指导正确的控制器… MVC框架似乎使用[HttpControllerDispatcher ] here,所以借用一些代码,你可以在这里放置自己的控制器/路由选择代码 – 你可以访问路由和选择器,并可以自己交换它. 这个CustomHttpControllerDispatcher代码仅用于DEMO …查找该行
也许有一个玩… 示例路线: 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); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何防止ASP.NET站点的图像热链接?
- asp.net-core – “如果从deploy文件夹运行,则需要”库’ho
- asp.net-mvc – 强大类型的ASP.NET MVC与ADO.NET实体框架
- asp.net-mvc – Cakephp在asp.net mvc中烘焙等效
- asp.net – 汇总历史正常运行时间数据
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇]
- asp.net-mvc – asp.net mvc 3中的参考脚本库是什么?
- 缺少版本和工具:.NET Core,Core Tools,dotnet Core CLI,
- iis-7.5 – IIS 7.5 Siteminder不保护ASP.net MVC请求
- asp.net-mvc – MVC很容易让经典的ASP人学习
- asp.net – 通过IP地址在IIS 6中调节Bandands
- asp.net-mvc – 什么首先启动Application_Start或
- asp.net-mvc – 将大型实体列表映射到ViewModels
- EXCEL文件导入时报_未在本地计算机上注册Microso
- asp.net – 如果我没有为action方法指定[httpGet
- ASP.Net Cookieless如何工作?
- asp.net-web-api – IExceptionHandler的多个实现
- 获取会话在ASP.NET中优雅地过期
- asp.net – 使用Typescript时Visual Studio 2015
- asp.net-core – 实体框架核心服务默认生命周期