ASP.NET Web API为单个路由定制IHttpControllerSelector
|
我需要一个自定义的IHttpControllerSelector,它只应用于特定的路由.所有其他Web api路由应使用IHttpControllerSelector的默认实现. 在研究时我发现以下代码意味着在应用程序启动时替换IHttpControllerSelector,但它完全替换了默认的控制器选择器,这导致应用程序中的所有路由都使用我的自定义控制器选择器: config.Services.Replace(typeof(IHttpControllerSelector),new CustomControllerSelector(config)); 有没有办法为单个路由配置IHttpControllerSelector? 解决方法您可以为需要使用不同控制器选择逻辑的路由分配每路由消息处理程序.此处理程序将使用标记标记HttpRequestMessage,该标记需要以不同方式处理此请求.然后只需使CustomControllerSelector继承自DefaultHttpControllerSelector并检查该标志: >如果已设置,请继续使用自定义逻辑 这是代码: 1)消息处理程序,设置标志 public class RouteSpecificHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
{
request.Properties["UseCustomSelector"] = true;
return base.SendAsync(request,cancellationToken);
}
}
2)仅将每个路由消息处理程序分配给特定路由(不要为其他路由运行) config.Routes.MapHttpRoute(
name: "MyRoute",routeTemplate: "api/dummy/{id}",defaults: new {controller = "Dummy",id = RouteParameter.Optional},constraints: null,handler: new RouteSpecificHandler { InnerHandler = new HttpControllerDispatcher(config) }
);
3)尊重旗帜的自定义选择器: public class CustomSelector : DefaultHttpControllerSelector
{
public CustomSelector(HttpConfiguration configuration) : base(configuration)
{
}
public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
if (request.Properties.ContainsKey("UseCustomSelector") &&
request.Properties["UseCustomSelector"] as bool? == true)
{
//your logic goes here
}
return base.SelectController(request);
}
}
4)注册选择器: config.Services.Replace(typeof(IHttpControllerSelector),new CustomSelector(config)); 编辑 如果你不希望从DefaultHttpControllerSelector继承 – 那么直接实现IHttpControllerSelector,而不是调用base.SelectController(request)将旧选择器保存为类中的字段/属性 public class CustomSelector : IHttpControllerSelector
{
private HttpConfiguration _config;
public IHttpControllerSelector PreviousSelector {get; set;}
public CustomSelector(HttpConfiguration configuration)
{
_config = configuration;
}
public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
if (request.Properties.ContainsKey("UseCustomSelector") &&
request.Properties["UseCustomSelector"] as bool? == true)
{
//your logic goes here
}
return PreviousSelector.SelectController(request);
}
}
然后只需更改注册: var previousSelector = config.Services.GetService(typeof(IHttpControllerSelector)) as IHttpControllerSelector;
config.Services.Replace(typeof(IHttpControllerSelector),new CustomSelector(config) { PreviousSelector = previousSelector}); (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何从强类型视图中隐藏实体框架实体属性?
- asp.net-mvc – LINQ to SQL分页和COUNT(*)
- asp默认文档不能在IIS7上运行
- 为什么我的客户端去服务器来检查在使用ASP.NET MVC包时是否
- asp.net-mvc – 为什么ASP.NET MVC在从IE而不是firefox发布
- asp.net – 引用不稳定的DLL
- asp.net – 替换web.config变换中的IIS重写规则
- asp.net-mvc – asp.net mvc路由:如何使用默认动作,但非默
- asp.net-mvc – 使用cshtml页面的angularjs不是带有web api
- .net – RegularExpressionValidator使用除Regex之外的其他
- asp.net-mvc-3 – StringLength属性行为
- C# 中的委托和事件 [转载]
- asp.net-mvc – ASP.NET MVC Validationsummary
- asp.net-mvc – RenderSection在ASP.NET MVC3中的
- asp.net-mvc – 使用键入的HTML助手时的模型前缀
- asp.net-mvc – MVC4 SimpleMemberhip’提供商遇
- asp.net-mvc – ConfigurationManager读取错误的
- asp.net-mvc – 缓存CSS和JS文件
- asp.net – 检查.NET中两个双精度相等的问题 –
- asp.net-mvc – 使用Knockout JS MVC服务器端模型
