当前位置: 移动技术网 > IT编程>开发语言>.net > AreaHttpControllerSelector 对 Web Api 实现 Area 路由控制

AreaHttpControllerSelector 对 Web Api 实现 Area 路由控制

2018年10月27日  | 移动技术网IT编程  | 我要评论

手机窃听木马,江门汇悦城,新视觉高清体育

结合此文章:

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
    }
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网