加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-5 – MVC5中的域路由

发布时间:2020-12-16 00:04:12 所属栏目:asp.Net 来源:网络整理
导读:我知道有一些关于类似事情的文章,但没有一篇对我有帮助. 我有一个单独的Web应用程序,其中多个域指向同一个应用程序.我想知道如何根据尝试访问Web应用程序的域将路由映射到特定控制器. 我目前尝试的是以下但没有成功. routes.MapRoute( name: "WowPoetry",url
我知道有一些关于类似事情的文章,但没有一篇对我有帮助.

我有一个单独的Web应用程序,其中多个域指向同一个应用程序.我想知道如何根据尝试访问Web应用程序的域将路由映射到特定控制器.

我目前尝试的是以下但没有成功.

routes.MapRoute(
    name: "WowPoetry",url: "wowpoetry.org/{action}/{id}",defaults: new { controller = "Wow",action = "Index",id = UrlParameter.Optional }
);

解决方法

我最终遵循本教程来实现我想要的,除了我以前做域路由而不是子域路由.

Domain Routing Tutorial ASP.Net MVC

执行:

routes.Add(new DomainRoute("wowpoetry.org","",new { controller = "Wow",action = "Index" }));

DomainData.cs

public class DomainData
{
    public string Protocol { get; set; }
    public string HostName { get; set; }
    public string Fragment { get; set; }
}

DomainRoute.cs

public class DomainRoute : Route
{
    private Regex domainRegex;
    private Regex pathRegex;

    public string Domain { get; set; }

    public DomainRoute(string domain,string url,RouteValueDictionary defaults)
        : base(url,defaults,new MvcRouteHandler())
    {
        Domain = domain;
    }

    public DomainRoute(string domain,RouteValueDictionary defaults,IRouteHandler routeHandler)
        : base(url,routeHandler)
    {
        Domain = domain;
    }

    public DomainRoute(string domain,object defaults)
        : base(url,new RouteValueDictionary(defaults),object defaults,routeHandler)
    {
        Domain = domain;
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        // Build regex
        domainRegex = CreateRegex(Domain);
        pathRegex = CreateRegex(Url);

        // Request information
        string requestDomain = httpContext.Request.Headers["host"];
        if (!string.IsNullOrEmpty(requestDomain))
        {
            if (requestDomain.IndexOf(":") > 0)
            {
                requestDomain = requestDomain.Substring(0,requestDomain.IndexOf(":"));
            }
        }
        else
        {
            requestDomain = httpContext.Request.Url.Host;
        }
        string requestPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) +
                             httpContext.Request.PathInfo;

        // Match domain and route
        Match domainMatch = domainRegex.Match(requestDomain);
        Match pathMatch = pathRegex.Match(requestPath);

        // Route data
        RouteData data = null;
        if (domainMatch.Success && pathMatch.Success && requestDomain.ToLower() != "tg.local" &&
            requestDomain.ToLower() != "tg.terrasynq.net" && requestDomain.ToLower() != "www.townsgossip.com" &&
            requestDomain.ToLower() != "townsgossip.com")
        {
            data = new RouteData(this,RouteHandler);

            // Add defaults first
            if (Defaults != null)
            {
                foreach (KeyValuePair<string,object> item in Defaults)
                {
                    data.Values[item.Key] = item.Value;
                }
            }

            // Iterate matching domain groups
            for (int i = 1; i < domainMatch.Groups.Count; i++)
            {
                Group group = domainMatch.Groups[i];
                if (group.Success)
                {
                    string key = domainRegex.GroupNameFromNumber(i);

                    if (!string.IsNullOrEmpty(key) && !char.IsNumber(key,0))
                    {
                        if (!string.IsNullOrEmpty(group.Value))
                        {
                            data.Values[key] = group.Value;
                        }
                    }
                }
            }

            // Iterate matching path groups
            for (int i = 1; i < pathMatch.Groups.Count; i++)
            {
                Group group = pathMatch.Groups[i];
                if (group.Success)
                {
                    string key = pathRegex.GroupNameFromNumber(i);

                    if (!string.IsNullOrEmpty(key) && !char.IsNumber(key,0))
                    {
                        if (!string.IsNullOrEmpty(group.Value))
                        {
                            data.Values[key] = group.Value;
                        }
                    }
                }
            }
        }

        return data;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext,RouteValueDictionary values)
    {
        return base.GetVirtualPath(requestContext,RemoveDomainTokens(values));
    }

    public DomainData GetDomainData(RequestContext requestContext,RouteValueDictionary values)
    {
        // Build hostname
        string hostname = Domain;
        foreach (KeyValuePair<string,object> pair in values)
        {
            hostname = hostname.Replace("{" + pair.Key + "}",pair.Value.ToString());
        }

        // Return domain data
        return new DomainData
        {
            Protocol = "http",HostName = hostname,Fragment = ""
        };
    }

    private Regex CreateRegex(string source)
    {
        // Perform replacements
        source = source.Replace("/",@"/?");
        source = source.Replace(".",@".?");
        source = source.Replace("-",@"-?");
        source = source.Replace("{",@"(?<");
        source = source.Replace("}",@">([a-zA-Z0-9_-]*))");

        return new Regex("^" + source + "$");
    }

    private RouteValueDictionary RemoveDomainTokens(RouteValueDictionary values)
    {
        var tokenRegex =
            new Regex(
                @"({[a-zA-Z0-9_-]*})*.?/?({[a-zA-Z0-9_-]*})*.?/?({[a-zA-Z0-9_-]*})*.?/?({[a-zA-Z0-9_-]*})*.?/?({[a-zA-Z0-9_-]*})*.?/?({[a-zA-Z0-9_-]*})*.?/?({[a-zA-Z0-9_-]*})*.?/?({[a-zA-Z0-9_-]*})*.?/?({[a-zA-Z0-9_-]*})*.?/?({[a-zA-Z0-9_-]*})*.?/?({[a-zA-Z0-9_-]*})*.?/?({[a-zA-Z0-9_-]*})*.?/?");
        Match tokenMatch = tokenRegex.Match(Domain);
        for (int i = 0; i < tokenMatch.Groups.Count; i++)
        {
            Group group = tokenMatch.Groups[i];
            if (group.Success)
            {
                string key = group.Value.Replace("{","").Replace("}","");
                if (values.ContainsKey(key))
                    values.Remove(key);
            }
        }

        return values;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读