2010-07-14 52 views
0

我發現自己處於困境。我們正在研究由多個部分組成的ASP.NET MVC 2應用程序。將這些部分跨越幾個子域是設計目標。每個子域都有自己的控制器。跨多個子域的URL路由

挑戰在於我們的託管服務提供商的控制面板允許兩種形式的子域名重定向,並且它們都不符合法案。選項有:

  • 重定向到URL。決定是否重定向到相對於請求URL的確切目標或目的地。

  • 重定向到我的託管空間中的特定文件夾。

我會盡力說明預期的行爲。假設默認路由是{controller}/{action}/{id},我希望URL http://subdomain.welcome.com/a/b由MVC應用程序處理,如http://welcome.com/subdomain/a/b

URL重定向可以解決這個問題,除了用戶在瀏覽器中看到URL更改的事實。我們不希望客戶端看到重定向發生。

重定向到我們的MVC應用程序根文件夾根本不起作用。該應用程序不接受請求,並且IIS返回4xx錯誤。

編輯:

爲了找到答案,我將簡化這一點。 「重定向到URL」沒有做我想做的事情,讓葉重定向到一個文件夾。

如果我將一個子域重定向到我的MVC應用程序的根文件夾,並且IIS不會提取請求,這是IIS還是我的提供程序的限制?

回答

6

可以讓你的託管網站主機頭*.mydomain.com應對?意思是說,您的網站可以請求您的主域名的任何子域名?如果是這樣,那麼請參考this post關於如何處理MVC應用中的子域路由,你應該很好。

但是我會更新這篇文章中的代碼,以使代碼更加簡潔。無論如何,確保你的404錯誤適用於試圖訪問不存在的子域的人。

public class ExampleRoute : RouteBase 
{ 

    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     var url = httpContext.Request.Headers["HOST"]; 
     var index = url.IndexOf("."); 

     if (index < 0) 
      return null; 

     var subDomain = url.Substring(0, index); 

      var routeData = new RouteData(this, new MvcRouteHandler()); 
      routeData.Values.Add("controller", subdomain); //attempts to go to controller action of the subdomain 
      routeData.Values.Add("action", "Index"); //Goes to the Index action on the User2Controller 

      return routeData; 
    } 

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
    { 
     //Implement your formating Url formating here 
     return null; 
    } 
} 
0

不知道這是矯枉過正(這實際上是用來服務於從一個zip文件或資源文件,網頁等),但......也許你可以使用一個虛擬路徑提供?..

實現一個類,從的VirtualPathProvider繼承,並將其註冊在全球啓動,像這樣:

HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider()); 

然後實現從VirtualFile繼承的類,並從的GetFile()覆蓋在你的虛擬路徑提供實施服務它:

public override VirtualFile GetFile(string virtualPath) 
{ 
if(IsVirtualFile(virtualPath)) 
    return new MyVirtualFile(virtualPath); 
return base.GetFile(virtualPath); 
} 

注: IsVirtualFile是你必須實現一個功能,可以根據規則您對URL格式等