modules runAllManagedModulesForAllRequests=true /(转1)
最近在使用 MVC 開發(fā)的時(shí)候,遇到一個(gè)對(duì)我來說“奇怪的問題”,就是使用 BundleTable 進(jìn)行 CSS、JS 文件綁定,然后使用 Styles.Render、Scripts.Render 進(jìn)行獲取,但總是獲取不到綁定的 CSS、JS 文件,然后報(bào)“404錯(cuò)誤”,話說再多,不如一個(gè)代碼示例。
BundleConfig 配置代碼:
public class BundleConfig {// For more information on bundling, visit http://go.microsoft.com/fwlink/?LinkId=301862public static void RegisterBundles(BundleCollection bundles){bundles.Add(new ScriptBundle("~/bundles/test.js").Include("~/Scripts/bootstrap.js","~/Scripts/respond.js"));bundles.Add(new StyleBundle("~/bundles/test.css").Include("~/Content/bootstrap.css","~/Content/site.css"));} }?
視圖獲取:
<head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>@ViewBag.Title - My ASP.NET Application</title>@Styles.Render("~/bundles/test.css")@Scripts.Render("~/bundles/test.js") </head>這個(gè)問題我相信大家應(yīng)該都遇到過,當(dāng)然前提條件是按照我上面那種寫法,問題出來了,那該如何解決呢?因?yàn)槟悴恢绬栴}出在哪,所以只能進(jìn)行反復(fù)的嘗試,最后我無意間把 .css 和 .js 后綴去掉就可以了,在上一個(gè)開發(fā)項(xiàng)目我就是這么干的,然后現(xiàn)在開發(fā)的項(xiàng)目又遇到這個(gè)問題,這就引起了我的重視,當(dāng)然這不是一個(gè)解決方法,只是你不知道它背后的東西罷了。
?
小標(biāo)簽:當(dāng)使用 VS 調(diào)試模式時(shí),即 web.config 中 debug="true",使用 BundleConfig.RegisterBundles 進(jìn)行注冊(cè)是沒有效果的,但是可以展示,只不過沒有起到“綁定”文件的作用,解決方式是,需要手動(dòng)在 Application_Start 代碼中添加:BundleTable.EnableOptimizations = true;
除了把 .css 和 .js 后綴去掉,網(wǎng)上搜索,還有一種解決方法就是,在 web.config 添加如下配置:
<system.webServer><modules runAllManagedModulesForAllRequests="true"></modules></system.webServer>runAllManagedModulesForAllRequests 這個(gè)東西,之前我也遇到過,但不是像這次使用 Styles.Render、Scripts.Render 引起的,而是使用 MapRoute 進(jìn)行 .htm 文件路由配置的時(shí)候,出現(xiàn)“404”錯(cuò)誤,然后在 web.config 添加上面的配置就可以了,我還紀(jì)錄了一篇博文:?【記錄】ASP.NET MVC MapRoute .htm 不起作用?,哎,當(dāng)時(shí)并沒有深入進(jìn)行研究 runAllManagedModulesForAllRequests,只是認(rèn)為既然能解決問題就行了,現(xiàn)在一想,其實(shí)心里有點(diǎn)后怕,為什么這樣說?看下面就知道了。
runAllManagedModulesForAllRequests 到底是什么東西呢?其實(shí)從它名字上面,你就可以明白一點(diǎn),這也就是命名好的好處啊,咳咳,說白了,其意思就是為所有 Modules 管理請(qǐng)求的一個(gè)開關(guān),如果設(shè)置為 true,就是把?所有請(qǐng)求?到 Modules 的通道打通了,沒有任何阻攔,那 Modules 又是什么呢?字面意思可以理解為“模塊”或“單元”的意思,它是屬于 Web 服務(wù)器的東西,和 Web 應(yīng)用程序不太相關(guān),Web 應(yīng)用程序只是對(duì)它發(fā)起一個(gè)請(qǐng)求,Modules 的相關(guān)東西,可以看下這一篇非常好的文章:?IIS Modules Overview?。
使用 IIS 部署站點(diǎn)的時(shí)候,在點(diǎn)擊站點(diǎn),右側(cè)會(huì)有一個(gè)“主頁”,我們會(huì)看到 Modules 的“身影”:
點(diǎn)擊“模塊”,就可以看到 IIS 所有的默認(rèn) Modules:
所有 Module 的具體說明可以查看:?Module Reference?,我們看一個(gè)等會(huì)我們要用到的 Module-StaticFileModule(靜態(tài)文件管理模塊):
- Description: Sends out static files with the file extension .html, .jpg, as well as many others. The staticContent/mimeMap configuration collection determines the list of file extensions.
- Configuration sections: system.webServer/staticContent
- Dependencies: None.
- Potential issues when removing this module: Static files no longer become served. Requests for files return a 404 Not Found error indicating that no handler was matched.
上面說到,使用 MapRoute 進(jìn)行 .htm 文件路由配置,出現(xiàn)“404錯(cuò)誤”,我原本是想通過配置 StaticFileModule 進(jìn)行解決,試過之后發(fā)現(xiàn)不行,staticContent/mimeMap 配置中,IIS 默認(rèn)是有 .htm 配置的,具體為:?<mimeMap fileExtension=".htm" mimeType="text/html"/>?,詳細(xì)博文介紹:?IIS 6中mimemap屬性的默認(rèn)設(shè)置?,而且最重要的是 StaticFileModule 是管理所有靜態(tài)文件請(qǐng)求的,其實(shí) MapRoute 進(jìn)行 .htm 文件路由配置的請(qǐng)求,是到不了 StaticFileModule 模塊處理的,要不然早就可以訪問了,URL 路由配置有一個(gè)單獨(dú)的模塊-UrlMappingsModule,這部分內(nèi)容后面再了解。
至于 Styles.Render、Scripts.Render 獲取包含后綴綁定的“404錯(cuò)誤”,可以用下面配置進(jìn)行解決:
<system.webServer><modules><add name="BundleModule" type="System.Web.Optimization.BundleModule" /></modules></system.webServer>其實(shí)上面這兩個(gè)問題的“另類”解決方式,歸根到底就是想避免使用?runAllManagedModulesForAllRequests="true"?,為什么要避免使用它?當(dāng)然是有原因的,在說這個(gè)之前,再來看一個(gè)有意思的問題,可能和這個(gè)不太相關(guān),但我還是想說一下。
先來看一段 web.config 配置:
<configuration><system.web><authentication mode="Forms"><forms name="MembershipCookie" loginUrl="Login.aspx" protection="All" timeout="525600" slidingExpiration="true" enableCrossAppRedirects="true" path="/" /></authentication><authorization><deny users="?" /></authorization></system.web><location path="Default.aspx"><system.web><authorization><allow users="*"/></authorization></system.web></location> </configuration>這段代碼表示什么意思呢?authorization 配置的用戶訪問類型為“普通用戶授權(quán)后才能訪問”,location/authorization 是對(duì)某一頁面進(jìn)行身份驗(yàn)證,針對(duì) Default.aspx 的身份驗(yàn)證類型為“匿名可訪問”,并且 Default.aspx 為此站點(diǎn)的默認(rèn)訪問文檔,可以理解為此站點(diǎn)出了 Default.aspx,其他頁面訪問都是需要身份驗(yàn)證的,然后跳轉(zhuǎn)到 Login.aspx。
運(yùn)行后,你會(huì)發(fā)現(xiàn)其實(shí)并不是這么回事,比如訪問 www.mysite.com,按照配置應(yīng)該會(huì)訪問 www.mysite.com/Default.aspx,但是你會(huì)發(fā)現(xiàn),它會(huì)跳轉(zhuǎn)到 www.mysite.com/Login.aspx,為什么會(huì)這樣呢?其實(shí)是 IIS 版本更新的問題,Stack Overflow 中詳細(xì)的問題描述:?ASP.NET 2.0 and 4.0 seem to treat the root url differently in Forms Authentication?,在他問題描述中,嘗試用 UrlRewriter,但是還是沒有起到效果,最后做了一個(gè)測試:
ASP.NET Version Url Behaviour ------------------------------------------------------------------------- 2.0 http://example.com Renders Default.aspx 2.0 http://example.com/Default.aspx Renders Default.aspx 4.0 http://example.com Redirects to Login.aspx 4.0 http://example.com/Default.aspx Renders Default.aspx相關(guān)的兩篇 IIS 更新說明:
- A update is available that enables certain IIS 7.0 or IIS 7.5 handlers to handle requests whose URLs do not end with a period
- Authorization fails for requests to the Default Document after KB980368 is installed in Internet Information Services (IIS) 7.0 or 7.5
第一篇博文主要是說明 IIS 的一個(gè)更新,具體內(nèi)容可以簡化為:After this patch is applied, ASP.NET 4 applications can handle requests for extensionless URLs. Therefore, managed HttpModules that run prior to handler execution will run. 什么意思?就是處理程序增加了一個(gè)"*"的映射,也就是說,比如文中提到的,更新之前只能訪問如下 URL:www.example.com/ExampleSite/ExampleFile.,注意后面是有“點(diǎn)”的,也就是只能訪問有擴(kuò)展名的 URL,更新之后,可以訪問無擴(kuò)展名的 URL,也就是可以把那個(gè)“點(diǎn)”去掉,這樣蘊(yùn)含什么意思呢?注意上面英文的后面一句話,這句話就說明了后面那篇博文的問題原因。
后面一篇博文主要也是說明,上面 Stack Overflow 中所描述的那個(gè)問題,比如我訪問 www.mysite.com,更新之前,會(huì)根據(jù)配置文件中的“默認(rèn)文檔”,找到相關(guān)頁面后,再根據(jù) web.config 中的身份驗(yàn)證配置,進(jìn)行處理并顯示,如果按照上面的 web.config 配置,訪問的是 www.mysite.com/Default.aspx(匿名用戶),但是更新后,IIS 就可以處理?無擴(kuò)展名?的 URL,得到響應(yīng)的 URL 后,會(huì)立馬交給 Modules 進(jìn)行處理,首先就是 UrlAuthentication、FromsAuthentication 模塊進(jìn)行身份驗(yàn)證處理,發(fā)現(xiàn)是“非法用戶”,然后就跳轉(zhuǎn)到了 www.mysite.com/Login.aspx,而直接訪問 www.mysite.com/Default.aspx,會(huì)先走配置文件的 location 身份驗(yàn)證說明,因?yàn)楦箩槍?duì)的是“無擴(kuò)展名”的 URL,而 www.mysite.com/Default.aspx 是有擴(kuò)展名的 URL,說了那么多,微軟最后給出的解決方案是:
<configuration><system.webServer><handlers><remove name="ExtensionlessUrl-Integrated-4.0" /><remove name="ExtensionlessUrl-ISAPI-4.0_64bit" /><remove name="ExtensionlessUrl-ISAPI-4.0_32bit" /></handlers></system.webServer> </configuration>其實(shí)這個(gè)問題和 runAllManagedModulesForAllRequests 不太相關(guān),但它可以帶你思考 URL 和 Modules 之間的“微妙關(guān)系”,至于為什么避免使用?runAllManagedModulesForAllRequests="true"?,我貼出兩篇博文:
- The art of simplicity: Optimize the performance of your web applications: Don’t use runAllManagedModulesForAllRequests="true”.
- Don't use runAllManagedModulesForAllRequests="true" when getting your MVC routing to work
這篇博文就到這,后面解決一下不配置?runAllManagedModulesForAllRequests="true"?,使用 MapRoute 進(jìn)行 .htm 文件路由配置,出現(xiàn)的“404錯(cuò)誤”。
轉(zhuǎn)載于:https://www.cnblogs.com/tianma3798/p/4257573.html
總結(jié)
以上是生活随笔為你收集整理的modules runAllManagedModulesForAllRequests=true /(转1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在ubuntu 14.04 编译andr
- 下一篇: poj 3104 Drying(二分查找