1.自定义HttpControllerSelector

    /// <summary>
/// 设置api支持namespace
/// </summary>
public class NamespaceHttpControllerSelector : DefaultHttpControllerSelector
{
private const string NamespaceRouteVariableName = "namespace_name";
private readonly HttpConfiguration _configuration;
private readonly Lazy<ConcurrentDictionary<string, Type>> _apiControllerCache; public NamespaceHttpControllerSelector(HttpConfiguration configuration)
: base(configuration)
{
_configuration = configuration;
_apiControllerCache = new Lazy<ConcurrentDictionary<string, Type>>(
new Func<ConcurrentDictionary<string, Type>>(InitializeApiControllerCache));
} private ConcurrentDictionary<string, Type> InitializeApiControllerCache()
{
IAssembliesResolver assembliesResolver = this._configuration.Services.GetAssembliesResolver();
var types = this._configuration.Services.GetHttpControllerTypeResolver().GetControllerTypes(assembliesResolver).ToDictionary(t => t.FullName, t => t); return new ConcurrentDictionary<string, Type>(types);
} public IEnumerable<string> GetControllerFullName(HttpRequestMessage request, string controllerName)
{
object namespaceName;
var data = request.GetRouteData();
IEnumerable<string> keys = _apiControllerCache.Value.ToDictionary<KeyValuePair<string, Type>, string, Type>(t => t.Key,
t => t.Value, StringComparer.CurrentCultureIgnoreCase).Keys.ToList(); if (!data.Values.TryGetValue(NamespaceRouteVariableName, out namespaceName))
{
return from k in keys
where k.EndsWith(string.Format(".{0}{1}", controllerName,
DefaultHttpControllerSelector.ControllerSuffix), StringComparison.CurrentCultureIgnoreCase)
select k;
} string[] namespaces = (string[])namespaceName;
return from n in namespaces
join k in keys on string.Format("{0}.{1}{2}", n, controllerName,
DefaultHttpControllerSelector.ControllerSuffix).ToLower() equals k.ToLower()
select k;
} public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
Type type;
if (request == null)
{
throw new ArgumentNullException("request");
}
string controllerName = this.GetControllerName(request);
if (string.IsNullOrEmpty(controllerName))
{
throw new HttpResponseException(request.CreateErrorResponse(HttpStatusCode.NotFound,
string.Format("No route providing a controller name was found to match request URI '{0}'", new object[] { request.RequestUri })));
}
IEnumerable<string> fullNames = GetControllerFullName(request, controllerName);
if (fullNames.Count() == 0)
{
throw new HttpResponseException(request.CreateErrorResponse(HttpStatusCode.NotFound, string.Format("No route providing a controller name was found to match request URI '{0}'", new object[] { request.RequestUri })));
} if (this._apiControllerCache.Value.TryGetValue(fullNames.First(), out type))
{
return new HttpControllerDescriptor(_configuration, controllerName, type);
}
throw new HttpResponseException(request.CreateErrorResponse(HttpStatusCode.NotFound, string.Format("No route providing a controller name was found to match request URI '{0}'", new object[] { request.RequestUri })));
}
}

2.注册路由

    public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//注册支持namespace的HttpControllerSelector,替换默认DefaultHttpControllerSelector
config.Services.Replace(typeof(IHttpControllerSelector), new NamespaceHttpControllerSelector(GlobalConfiguration.Configuration)); config.Routes.MapHttpRoute(
name: "Phone",
routeTemplate: "api/phone/{controller}/{action}/{id}",
defaults: new
{
id = RouteParameter.Optional,
namespace_name = new string[] { "Amy.WebUI.Api.Phone" }
}
); config.Routes.MapHttpRoute(
name: "ApiDefault",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new
{
id = RouteParameter.Optional,
namespace_name = new string[] { "Amy.WebUI.Api" }
}
);
}
}

这样我们就可以像areas一样使用webapi了

最新文章

  1. Log Buffer
  2. xcode armv6 armv7 armv7s arm64
  3. Can &#39;t connect to local MySQL server through socket &#39;/var/lib/mysql/mysql.sock &#39;(2) ;
  4. Java正则表达式详解
  5. (C++)STL排序函数sort和qsort的用法与区别
  6. 支付宝Demo 报错
  7. 网页Gzip
  8. 在一台电脑访问另一台电脑的mysql数据库
  9. xml格式化写入文件
  10. Android热更新开源项目Tinker集成实践总结
  11. 获取文本区域(textarea)行数【换行获取输入用户名个数】
  12. C语言漫谈(二) 图像显示 Windows和Linux
  13. BZOJ 4311: 向量( 按时间分治 + 线段树 )
  14. Git的简单安装
  15. 第3阶段——内核启动分析之make uImage编译内核(3)
  16. CodeForces 528D Fuzzy Search 多项式 FFT
  17. Bigger-Mai 养成计划,Docker之安装,部署
  18. 小学生噩梦——四则运算题库(python 全功能实现)
  19. angular中的MVC思想
  20. Codeforces 235C Cyclical Quest - 后缀自动机

热门文章

  1. CSS长度单位
  2. 【Hibernate 8】Hibernate的调优方法:抓取策略
  3. javacript 优化2
  4. WP_3种磁贴效果设置
  5. Android IOS WebRTC 音视频开发总结(十二)-- sufaceview
  6. c++库大全
  7. 实例分析ELF文件动态链接
  8. 在SQL中取出字符串中数字部分或在SQL中取出字符部分
  9. Java排序
  10. C# 标准查询表达式