2009-10-22 20 views
10

我正在嘗試使用System.Web.Routing來實現ASP.NET URL路由。而且這似乎在我的本地主機正常工作,但是當我上線我得到一個IIS 7的404錯誤(文件未找到)。僅供參考使用Windows Server 2008 IIS7。在IIS 7宿主環境中打破我的頭來獲取Url路由:ASP.NET

我認爲這在處理路由機制方面有所不同。但我無法弄清楚到底發生了什麼。以下是我迄今爲止所做的設置和更改,併爲我自己提供了一些功勞,它在本地非常合適。

web.config設置

然後我有一個具有以下標記在Application_Start部我已經定義一個路由作爲system.webserver部

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false"/> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <remove name="Session" /> 
     <add name="Session" type="System.Web.SessionState.SessionStateModule"/> 
     <add name="UrlRoutingModule" 
       type="System.Web.Routing.UrlRoutingModule, 
        System.Web.Routing, Version=3.5.0.0, 
        Culture=neutral, 
        PublicKeyToken=31BF3856AD364E35" /> 

    </modules> 
    <handlers> 
     <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
    </handlers> 

</system.webServer> 

然後如下:

void Application_Start(object sender, EventArgs e) 
{ 
    RegisterRoutes(RouteTable.Routes); 
} 
void RegisterRoutes(RouteCollection routes) 
{    
    routes.Add(
     "MyRoute", 
      new Route("ProductDetail/{ProductId}/{ProductName}", 
       new MyRouteHandler("~/ProductDetail.aspx"))); 
} 

最後MyRouteHandler如下所示:

public IHttpHandler GetHttpHandler(RequestContext requestContext) 
{ 
    var display = (Page)BuildManager.CreateInstanceFromVirtualPath(
        _virtualPath, typeof(Page)); 
    HttpContext.Current.Items["ProductId"] = requestContext.RouteData.Values["Product"]; 
    return display; 
} 

而路由頁面上,我抓住了產品ID如下

ProductId = (int)HttpContext.Current.Items["Product"]; 

這是我惹的結束。這在當地很好。我一直在嘗試這一段時間,但迄今沒有成功。

任何幫助將深表滿意。

謝謝...

+1

你有沒有實施任何重寫規則? – Rony 2010-06-10 17:56:14

回答

2

不知道您是否能夠找出問題所在......但是如果您仍然在尋找解決方案,那麼您可以嘗試以下方法。我不得不面對同樣的情況,並在Web配置中使用Rewrite規則來處理它,因爲它不需要任何路由機制。所以首先我鼓勵你刪除你可能擁有的任何路由設置以及Global.asax文件中的代碼。

然後在部分如下

<rewrite> 
    <rewriteMaps> 
     <rewriteMap name="map1" defaultValue="(.+)"/> 
    </rewriteMaps> 
    <rules> 
     <rule name="Rewrite rule1 for map1"> 
     <match url="product/(.+)/(.+)"/> 
     <conditions> 
      <add input="{map1:{REQUEST_URI}}" pattern="(.+)"/> 
     </conditions> 
     <action type="Rewrite" url="productdetail.aspx?Product={R:1}" appendQueryString="false" redirectType="Permanent"/> 
     </rule> 
    </rules> 
    </rewrite> 

如果你有問題理解重寫機制我建議你由Scott Guthrie的閱讀this article你可以添加重寫規則。

我認爲這應該爲你工作給你一個IIS 7.0或7.5環境。

+0

y我很早就想到了這個問題,並使用重寫映射本身修復了它...反正感謝您的回覆 – user153410 2011-01-16 22:24:32

+0

user153410,我有同樣的問題。你能建議你如何解決這個問題嗎? – Riz 2011-08-04 10:28:41

4

我跟着這篇文章: How to: Use Routing with Web Forms

之前,我發現我有我的共享主機,沒有對當地的問題。這是我的web.config。

我的主機使用IIS 7集成管道,我錯過了這一點:

<handlers> 
    <!---after all the others--->  
    <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" 
      path="UrlRouting.axd" 
      type="System.Web.HttpForbiddenHandler, 
      System.Web, Version=2.0.0.0, 
      Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
</handlers> 

編輯:根據您的設置和代碼,唯一剩下的就是要檢查,看看是否有路由DLL在web.config中定義,並部署到bin目錄:

<add assembly="System.Web.Routing, Version=3.5.0.0, 
    Culture=neutral, 
    PublicKeyToken=31BF3856AD364E35"/> 
+0

嗨,感謝您的回覆。你能告訴你對你的web.config做了什麼改變。這將非常有幫助。 – user153410 2009-10-24 21:33:28

+0

我加了什麼解決了我的問題。這篇文章非常清楚如何根據主機設置來設置路由。 – 2009-10-25 00:37:53

+0

嗨再次感謝您的答覆。我擁有Web.Config中的所有內容,並且我查看了您建議的文章。如何在Web.Config中擁有所有必要的設置。我真的無法弄清楚爲什麼這樣做。我不知道爲什麼IIS 7在如此簡單的事情中如此複雜,因爲現在URl路由或重寫非常普遍。 – user153410 2009-10-25 03:39:41

3

在web.config中試試這個。爲我工作。

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 
+0

將網站表單本地開發者上傳到虛擬主機後,獲得了404路由。 runAllManagedModulesForAllRequests解決了這個問題。 – 2012-05-08 16:14:20