asp.net-mvc-5 – MVC5中的域路由
发布时间:2020-05-28 04:26:38 所属栏目: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;
}
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 处理程序“PageHandlerFactory-ISAPI-4.0_32bit
- iis-6 – Asp.net mvc 4 on iis6:“无法找到该页面”
- CookieAuthenticationOptions,ExpireTimeSpan不起作用
- asp.net-mvc – ASP.NET MVC – 如何从不同的控制器维护Mod
- asp.net-mvc – 对HTTP POST请求的正确响应是什么?
- asp.net-mvc – 如何设置html.EditorFor helper的大小?
- asp.net – 使用HtppWebRequest发布表单数据没有效果
- asp.net-mvc-3 – 是否可以在将razor viewengine发送到客户
- asp.net-mvc – 如何从MVC控制器返回Json对象到视图
- asp.net – 从另一个域配置IIS身份验证
推荐文章
站长推荐
热点阅读
