AreaHttpControllerSelector 对 Web Api 实现 Area 路由控制
结合此文章:http://www.cnblogs.com/wuhuacong/p/5828038.html
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net.Http;
using System.Reflection;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Dispatcher;
using System.Web.Http.Routing;
namespace PEMSoft.Web.AppServer
{
/// <summary>
/// Area路由控制,如URL中含{action}则通过Area查找控制器,不存在{area}或找不到控制器则按默认规则再找一次
/// 作者:ifu25
/// 日期:2017/07/08
/// 参考:http://www.jianshu.com/p/8242215cd8c0 、 http://www.cnblogs.com/Silicon-Fado/p/3571938.html
/// </summary>
public class AreaHttpControllerSelector : DefaultHttpControllerSelector
{
#region 变量
/// <summary>
/// Area名称
/// </summary>
private const string _areaRouteVariableName = "area";
private readonly HttpConfiguration _configuration;
private Dictionary<string, Type> _apiControllerTypes;
/// <summary>
/// 所有API控制器集合
/// </summary>
private Dictionary<string, Type> ApiControllerTypes
{
get { return _apiControllerTypes ?? (_apiControllerTypes = GetControllerTypes()); }
}
#endregion
/// <summary>
/// 构造
/// </summary>
public AreaHttpControllerSelector(HttpConfiguration configuration) : base(configuration)
{
_configuration = configuration;
}
/// <summary>
/// 覆写父类的选择控制器方法,通过此方法实现根据Area查找控制器
/// </summary>
public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
//选通过Area查找控制器,找不到则忽略Area再找一次
return GetApiController(request) ?? base.SelectController(request);
}
#region 内部方法
/// <summary>
/// 获取所有控制器
/// </summary>
private static Dictionary<string, Type> GetControllerTypes()
{
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var types = assemblies.SelectMany(a => a.GetTypes().Where(t => !t.IsAbstract && t.Name.EndsWith(ControllerSuffix) && typeof(IHttpController).IsAssignableFrom(t)))
.ToDictionary(t => t.FullName, t => t);
return types;
}
/// <summary>
/// 为给定的HttpRequestMessage选择带Area的控制器,没有Area则返回null
/// </summary>
private HttpControllerDescriptor GetApiController(HttpRequestMessage request)
{
var controllerName = base.GetControllerName(request);
var areaName = GetAreaName(request);
if (string.IsNullOrEmpty(areaName))
{
return null;
}
var type = GetControllerTypeByArea(areaName, controllerName);
if (type == null)
{
return null;
}
return new HttpControllerDescriptor(_configuration, controllerName, type);
}
/// <summary>
/// 从HttpRequestMessage获取Area,没有指定Area则返回null
/// </summary>
private static string GetAreaName(HttpRequestMessage request)
{
var data = request.GetRouteData();
if (!data.Values.ContainsKey(_areaRouteVariableName))
{
return null;
}
return data.Values[_areaRouteVariableName].ToString().ToLower();
}
/// <summary>
/// 获取指定Area下的控制器
/// </summary>
/// <param name="areaName">Area名称</param>
/// <param name="controllerName">控制器名称</param>
private Type GetControllerTypeByArea(string areaName, string controllerName)
{
var areaNameToFind = string.Format(".{0}.", areaName.ToLower());
var controllerNameToFind = string.Format(".{0}{1}", controllerName, ControllerSuffix);
return ApiControllerTypes.Where(t => t.Key.ToLower().Contains(areaNameToFind) && t.Key.EndsWith(controllerNameToFind, StringComparison.OrdinalIgnoreCase))
.Select(t => t.Value).FirstOrDefault();
}
#endregion
}
}
AreaHttpControllerSelector 对 Web Api 实现 Area 路由控制的更多相关文章
- 【ASP.NET Web API教程】4.1 ASP.NET Web API中的路由
原文:[ASP.NET Web API教程]4.1 ASP.NET Web API中的路由 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. ...
- Web Api源码(路由注册)
这篇文章只是我学习Web API框架的输出,学习方法还是输出倒逼输入比较行得通,所以不管写的好不好,坚持下去,肯定有收获.篇幅比较长,仔细思考阅读下来大约需要几分钟. 做.NET开发有好几年时间了,从 ...
- Web API中的路由(一)——约定路由
一.Web API中的路由概念 路由的作用用一句话说明:通过request的uri找到处理该请求的Controller,Action,以及给Action的参数赋值. 一些路由的基本概念: route: ...
- ASP.NET Web API中的路由
ASP.NET Web API的默认路由在App_Start目录中的WebApiConfig.cs文件中定义的. public static class WebApiConfig { public s ...
- Web API中的路由(二)——属性路由
一.属性路由的概念 路由让webapi将一个uri匹配到对应的action,Web API 2支持一种新类型的路由:属性路由.顾名思义,属性路由使用属性来定义路由.通过属性路由,我们可以更好地控制We ...
- Web API配置自定义路由
默认访问Web API时,是无需指定method名.它会按照默认的路由来访问.如果你的Web API中出现有方法重载时,也许得配置自定义路由: 标记1为自定义路由,标记2为默认路由,需要把自定义路由排 ...
- ASP.NET WEB API 中的路由调试与执行过程跟踪
路由调试 RouteDebugger 是调试 ASP.NET MVC 路由的一个好的工具,在ASP.NET WEB API中相应的有 WebApiRouteDebugger ,Nuget安装 Inst ...
- WebApi官网学习记录---web api中的路由
如果一条路由匹配,WebAPI选择controller和action通过如下方式: 1.找到controller,将"controller"赋值给{controller}变量 2. ...
- Web API框架学习——路由(一)
HttpConfiguration(ASP.NET Web API管道的配置是通过HttpConfiguration来完成) : 包括路由注册在内的对整个ASP.NET Web API管道的配置是通过 ...
随机推荐
- mybatis 操作数据错误Truncated incorrect DOUBLE value: ''
网上查到遇到次错误造成的原因: UPDATE TSYS_ROLE_RIGHTSET ACTIVE_FLAG = '2' and UPDATE_PERSON = 'CaiYiHua' and UPDA ...
- 使用ServiceDesk Plus保证及时解决问题,防止违反SLA
- Hibernate 的Configuration、sessionFactory和session和transaction对象解释
1.Configuration对象: Configuration conf=new Configuration(); conf.configure(); 1.1 到 src下面找到名称hibernat ...
- 2019.01.20 bzoj5158 Alice&Bob(拓扑排序+贪心)
传送门 短代码简单题. 题意简述:对于一个序列XXX,定义其两个伴随序列a,ba,ba,b,aia_iai表示以第iii个数结尾的最长上升子序列长度,bib_ibi表示以第iii个数开头的最长下降 ...
- 实现一套山寨springMVC
重复造轮子没有意义,但是通过现已存在的轮子,模仿着思路去实现一套,还是比较cool的.花了三天,终于深夜搞定!收益都在代码里,我干了,您随意! 一.简单思路 简单介绍: 1.所有的请求交给TyDisp ...
- 利用xshell远程连接centos安装oracle11g时在图形界面登录
1.首先给centos安装桌面环境.( yum groupinstall ‘GNOME Desktop’) 2.安装Xmanager软件 3.打开xshell,新建连接 填好主机和名称后,点击左侧连接 ...
- DDR4 PSOD输出的优点--DBI的优点
DDR4是JEDEC组织关于DRAM器件的下一代标准.DDR4主要是针对需要高带宽低功耗的场合.这些需求导致了DDR4芯片引入了一些新的特点,这些新的特点,导致在系统设计中,引入一些新的设计需求. D ...
- .NET 开源GIS项目
SharpMapSharpMap是一个基于.NET 2.0使用C#开发的Map渲染类库,可以渲染ESRI Shape.PostGIS.MS SQL等格式的GIS数据,通过扩展地图数据Provider, ...
- c#+web下载文件夹
最近公司在做工程项目,实现文件夹下载. 网上找了很久,发现网上的代码都有相似的问题,不过最终还是让我找到了一个符合的项目. 工程: 进行项目文件夹下载功能分析,弄清楚文件夹下载的原理,提供的数据支持. ...
- HTTP文件上传服务器-支持超大文件HTTP断点续传的实现办法
最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传.笔者在以前的博客如何实现支持大文件的高性能HTTP文件上传服务器已经介绍了实现大文件上传的一些基本 ...