日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

asp.net 二级域名(路由方式实现)

發布時間:2025/3/21 asp.net 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 asp.net 二级域名(路由方式实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

自從微軟發布 ASP.NET MVC 和routing engine (System.Web.Routing)以來,就設法讓我們明白你完全能控制URL和routing,只要與你的application path相結合進行擴展,任何問題都迎刃而解。如果你需要在所處的域或者子域處理數據標記的話,強制使用Default。

遺憾的是,ASP.NET MVC是基于虛擬目錄的,在實際項目卻有各種各樣的需求方案。

例如:

1:應用程序是多語言的,像cn.example.com應該被匹配到“www.{language}example.com”路由上。

2:應用程序是多用戶的,像username.example.com應該被匹配到“www.{clientname}.example.com”路由上。

3:應用程序是多子域的,像mobile.example.com應該被匹配到"www.{controller}.example.com/{action}....” 。

坐下來,深呼吸,開始我們ASP.NET MVC的神奇之旅吧。

定義routes

?

下面是我們定義簡單的route,不帶任何controller控制的route:

?


routes.Add("DomainRoute",?new?DomainRoute(?
"home.example.com",?//?Domain?with?parameters
"{action}/{id}",????//?URL?with?parameters
new?{?controller?=?"Home",?action?=?"Index",?id?=?""?}??//?Parameter?defaults
));

另一個例子是用我們的controller控制域名:

?


routes.Add("DomainRoute",?new?DomainRoute(?
"{controller}.example.com",?????//?Domain?with?parameters<?br?/>????"{action}/{id}",????//?URL?with?parameters
new?{?controller?=?"Home",?action?=?"Index",?id?=?""?}??//?Parameter?defaults
));

打算用controller 和action完全控制域名?

?


routes.Add("DomainRoute",?new?DomainRoute(?
"{controller}-{action}.example.com",?????//?Domain?with?parameters
"{id}",????//?URL?with?parameters
new?{?controller?=?"Home",?action?=?"Index",?id?=?""?}??//?Parameter?defaults
));

接下來是多語言route:


routes.Add("DomainRoute",?new?DomainRoute(?
"{language}.example.com",?????//?Domain?with?parameters
"{controller}/{action}/{id}",????//?URL?with?parameters
new?{?language?=?"en",?controller?=?"Home",?action?=?"Index",?id?=?""?}??//?Parameter?defaults
));



HtmlHelper 擴展方法

因為我們不希望所有的URL所產生HtmlHelper ActionLink要使用full URLs,第一件事我們會添加一些新的ActionLink,其中載有boolean flag是否要full URLs或沒有。利用這些,現在您可以添加一個鏈接到一個Action如下:

?

<%=?Html.ActionLink("About",?"About",?"Home",?true)%>

跟你以往的習慣沒有什么不同,不是嗎?
以下是一小段代碼:

?


public?static?class?LinkExtensions?
{?
public?static?string?ActionLink(this?HtmlHelper?htmlHelper,?string?linkText,?string?actionName,?string?controllerName,?bool?requireAbsoluteUrl)?
????{?
return?htmlHelper.ActionLink(linkText,?actionName,?controllerName,?new?RouteValueDictionary(),?new?RouteValueDictionary(),?requireAbsoluteUrl);?
????}?

//?more?of?these?

public?static?string?ActionLink(this?HtmlHelper?htmlHelper,?string?linkText,?string?actionName,?string?controllerName,?RouteValueDictionary?routeValues,?IDictionary<string,?object>?htmlAttributes,?bool?requireAbsoluteUrl)?
????{?
if?(requireAbsoluteUrl)?
????????{?
????????????HttpContextBase?currentContext?=?new?HttpContextWrapper(HttpContext.Current);?
????????????RouteData?routeData?=?RouteTable.Routes.GetRouteData(currentContext);?

????????????routeData.Values["controller"]?=?controllerName;?
????????????routeData.Values["action"]?=?actionName;?

????????????DomainRoute?domainRoute?=?routeData.Route?as?DomainRoute;?
if?(domainRoute?!=?null)?
????????????{?
????????????????DomainData?domainData?=?domainRoute.GetDomainData(new?RequestContext(currentContext,?routeData),?routeData.Values);?
return?htmlHelper.ActionLink(linkText,?actionName,?controllerName,?domainData.Protocol,?domainData.HostName,?domainData.Fragment,?routeData.Values,?null);?
????????????}?
????????}?
return?htmlHelper.ActionLink(linkText,?actionName,?controllerName,?routeValues,?htmlAttributes);?
????}?
}

在這沒什么特別的:有許多的擴展方法,把擴展的URL加到域名上。這是一個預設ActionLink helpers,我的精神食糧來了DomainRoute?class(詳見:Dark Magic)

Dark magic

瞥眼之間,您可能已經看到了我的DomainRoute類代碼段。這個類實際上是提取子域,并增加了象征性支持域部分的傳入的URL,

我們將擴展基類,它已經給了我們一些屬性和方法,但是我們得重寫他們!

?


public?class?DomainRoute?:?Route?
{??
//??

public?string?Domain?{?get;?set;?}?

//??

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

//?請求信息
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?domainMatch?=?domainRegex.Match(requestDomain);?
????????Match?pathMatch?=?pathRegex.Match(requestPath);

//?Route?數據

????????RouteData?data?=?null;?
if?(domainMatch.Success?&&?pathMatch.Success)?
????????{?
????????????data?=?new?RouteData(this,?RouteHandler);

//?添加默認選項
if?(Defaults?!=?null)?
????????????{?
foreach?(KeyValuePair<string,?object>?item?in?Defaults)?
????????????????{?
????????????????????data.Values[item.Key]?=?item.Value;?
????????????????}?
????????????}?

//?匹配域名路由
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;?
????????????????????????}?
????????????????????}?
????????????????}?
????????????}?

//?匹配域名路徑
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)?
????{?
//?獲得主機名

string?hostname?=?Domain;?
foreach?(KeyValuePair<string,?object>?pair?in?values)?
????????{?
????????????hostname?=?hostname.Replace("{"?+?pair.Key?+?"}",?pair.Value.ToString());?
????????}

//?Return?域名數據

return?new?DomainData?
????????{?
????????????Protocol?=?"http",?
????????????HostName?=?hostname,?
????????????Fragment?=?""
????????};?
????}

//?
}

?

轉載于:https://www.cnblogs.com/liangxiaofeng/p/5649739.html

總結

以上是生活随笔為你收集整理的asp.net 二级域名(路由方式实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜成年人视频 | a天堂亚洲 | 欧美一区二区三区黄色 | 国产精品久久久久久久久久辛辛 | 国产做受高潮动漫 | 男人阁久久| www.黄色在线观看 | 午夜日韩电影 | 亚洲乱码中文字幕久久孕妇黑人 | 天天射天天干天天 | 国产偷v| 国产白丝袜美女久久久久 | 奇米精品一区二区三区在线观看一 | 日韩视频一区二区在线观看 | √天堂在线 | 美女被啪羞羞粉色视频 | av在线影音| 欧美一卡二卡在线观看 | 69精品久久久久久久 | 神马久久久久 | 日本黄色成人 | 婷婷激情五月网 | 精品国产999 | 婷婷免费视频 | 免费在线观看视频 | 欧美毛片在线 | 成人永久免费视频 | 一区二区三区免费播放 | 日本一本在线视频 | 激情啪啪网 | 欧美乱码精品一区二区 | 日本电影大尺度免费观看 | 97超碰在线播放 | 99热偷拍 | 国产伦精品一区二区三区视频1 | 国产网站一区 | 久久久久极品 | 精品看片 | 中文字幕导航 | www.天天操| aaa一区二区三区 | 五月天男人天堂 | 一区二区三区精 | 国产最新地址 | 男人的天堂狠狠干 | 少妇床戏av | 蜜臀人妻四季av一区二区不卡 | 亚洲欧美综合另类 | 高清毛片aaaaaaaaa片 | 爆操女秘书 | 亚洲综合自拍偷拍 | 亚洲人成电影一区二区在线 | 乱色欧美 | 麻豆精品国产传媒mv男同 | 欧美绿帽合集videosex | 台湾三级伦理片 | av无码精品一区二区三区宅噜噜 | 色视频网站 | 精品视频成人 | 国产污视频| 激情aaa| xxxx国产| 91网址在线播放 | 深爱开心激情 | 黄色网址你懂得 | 精品一区精品二区 | 桃花色综合影院 | 国产一级爱c视频 | 色综合久久五月 | 欧美黑人又粗又大高潮喷水 | 国产精品50页 | 日韩午夜 | 四虎在线免费视频 | 国产精品理伦片 | 欧美交换配乱吟粗大25p | 中文字幕.com| 无码日韩精品一区二区 | 亚洲欧美一二三 | 美女18网站 | 天天综合久久综合 | 韩国三级在线看 | 欧美色视频一区二区三区 | 亚洲乱码在线观看 | 淫久久| 日本黄页网站免费大全 | 日韩精品一区二区三区免费视频 | 久久久成人精品 | 国产精品自拍偷拍视频 | 亚洲色图首页 | 免费网站在线高清观看 | 最新久久 | 男女羞羞无遮挡 | 精品成人久久久 | 日韩欧美一区二区三区在线观看 | 天天躁夜夜躁狠狠是什么心态 | 亚洲色图自拍 | 国产成人精品一区二区三区四区 | 女人私密又肥又大 | 国产精品亚洲成在人线 |