我的IIS7 5竟然不支援ASP NET路由
阿新 • • 發佈:2018-11-09
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
MVC模式下那些友好,遮蔽具體物理檔案的URL讓我眼饞,咱也想在WEB FORM專案用上一用。
按照指引,新增global.asax,寫上路由程式碼什麼的:
<%@ Application Language="C#" %><%@ Import Namespace="System.Web.Routing" %><script runat="server"> void Application_Start(object sender, EventArgs e) { // 在應用程式啟動時執行的程式碼 RegisterRoutes(RouteTable.Routes); } public static void RegisterRoutes(RouteCollection routes) { routes.MapPageRoute("", "", "~/default.aspx"); routes.MapPageRoute("test", "h/{product}" , "~/temp/test.aspx"); }
在IIS下一執行,居然報錯,Page Not Found!
然後在VS2012裡執行卻可以,排除是路由寫得不對的問題。
有大牛說,IIS7以前的版本,需要指定字尾名,加上.aspx,比如,應當用這種方式
routes.MapPageRoute("test", "h.aspx/{product}", "~/temp/test.aspx");
這說明,我這個IIS7.5裡面,如果不指定.ASPX,根本沒有經過ASP.NET的處理,路由不起作用。
這很奇怪,我的IIS是WIN7下的IIS7.5,應用程式池模式是整合,ASP.NET4.0,一切都符合傳說中的“無須任何配置就可以直接使用ASP.NET路由”的條件。
難道是因為我裝了微軟的URL重寫模組?解除安裝,重啟,不行。
重新註冊ASP.NET4.0,也是不行。
誰來告訴我?
======================================================================================
2013-09-11
灑家來告訴你。
只要在web.config裡,<system.webServer>加上這句就可以鳥:
<system.webServer><modules runAllManagedModulesForAllRequests="true" /></system.webServer>
應用程式池的模式需要為整合模式。
如果是經典模式,則要使用字尾名了,路由中的路徑如果沒有特定字尾名的話,是到達不了ASP.NET處理這一層的。當然可以使用.aspx、.ashx、.asmx這樣的字尾名,如:
routes.MapRoute( "test2", // 路由名稱 "{controller}.aspx/{action}/{id}", // 帶有引數的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 引數預設值 );
不過容易混淆,如果專案是WEBFORM和MVC混用的話,就更加混亂了。因為為了避免對aspx頁面使用MVC路由,通常會在global.asax裡宣告
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
這樣MVC路由中有.aspx的將會被過濾掉。
可以使用.mvc:
routes.MapRoute( "test2", // 路由名稱 "{controller}.mvc/{action}/{id}", // 帶有引數的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 引數預設值 );
注意.mvc不是ASP.NET保留的字尾名,需要在IIS裡對映。有些文章裡說裝了MVC以後就會自動支援,但我的作業系統是WIN7,IIS為7.5,裝了VS2012,從微軟站點下載了MVC3、MVC4都裝不上,IIS裡也不預設支援MVC字尾,沒關係,自己對映也一樣的:
或者直接在web.config裡寫也是一樣的:
<system.webServer> <handlers> <add name="MVC" path="*.mvc" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" preCondition="classicMode,runtimeVersionv4.0,bitness32" /> </handlers>
但是這些似乎都是多此一舉。因為如果是IIS7,用整合模式就什麼問題都解決了。如果是IIS6,我在兩臺win2003 sp2 + IIS6上試過,安裝了MVC3 + MVC4後,也跟整合模式一樣,根本不用什麼字尾名。