500 內部伺服器錯誤請求 .Net MVC 3 站點中的任何資源文件(css、js、圖像)
更新:我嘗試過的事情 - 請參閱下面的答案以獲取解決方案
- 我安裝了一個新的 MVC3 站點,它正確地提供了資源。這消除了 machine.config 設置的問題。
- 然後,我在 web.config 中逐節查看 web.config 中是否有任何特定更改導致問題。當配置相同時,新站點仍然有效,舊站點仍然損壞。
- 我解除安裝了 IIS,重新安裝了 IIS,然後再次安裝了應用程序,以試圖清除所有殘留的設置。還是很無聊。
- 然後我使用發布(而不是 msi 部署)到新目錄。我使用 iis 選項在已損壞的完全相同程式碼的新目錄上“創建應用程序”。事情很順利。
- 我假設了文件權限,所以我刪除了有問題的目錄並將新的工作版本重命名為舊目錄名稱。網站仍然很無聊。這讓我假設某些不在 machine.config 或 web.config 中的 iis 設置是罪魁禍首。
- 我使用了 IIS 6 元數據庫資源管理器(是的,我在 IIS 8 站點上使用了它)並且看到了很多不在工作站點中的條目。一個一個刪除後,我發現是我們MSI安裝過程中添加的“scriptMaps”條目導致了問題。這是為了在安裝過程中自動添加萬用字元映射而添加的。它適用於 IIS6,但顯然不適用於 IIS8。
我們有一個看起來像一個應用程序的 webforms 和 MVC3 應用程序。這部署在許多環境中(2003、2008、Win 7)並且工作正常。我剛剛在一台新的 Windows Server 2012 機器上設置了這些應用程序,除了獲取 MVC 站點的資源文件外,一切正常。瀏覽器得到一個
500 Internal Server Error Server Application Unavailable The web application you are attempting to access on this web server is currently unavailable. Please hit the "Refresh" button in your web browser to retry your request. Administrator Note: An error message detailing the cause of this specific request failure can be found in the application event log of the web server. Please review this log entry to discover what caused this error to occur._layout.cshtml 中引用了資源
<head> <meta http-equiv='X-UA-Compatible' content='IE=EmulateIE8' /> <title>@this.Title</title> <script type="text/javascript" src="@Url.Content("~/Scripts/2012.2.607/jquery-1.7.1.min.js")"></script> <script type="text/javascript" src="/Sentri7/scripts/jquery-p1s.banner.js"></script> <script type="text/javascript" src="/Sentri7/scripts/jquery-p1s.patientsearch.js"></script> <link type="text/css" rel="stylesheet" href="/sentri7/content/jquery-p1s.patientsearch.css"></link> <link type="text/css" rel="stylesheet" href="/sentri7/content/jquery-p1s.banner.css" /> <link type="text/css" rel="stylesheet" href="/quantifi/resources/application/css/jqueryui/jquery-ui-1.7.2.custom.css" /> <link type="text/css" rel="stylesheet" href="/quantifi/resources/application/css/styles.css" /> @(RenderSection("PageHead", required: false)) </head>以及使用 Telerik 腳本管理器:
@{ Title = "Reportable Conditions"; SelectedSubTab = SubTabIndex.Reportables; Html.Telerik().ScriptRegistrar().DefaultGroup(dg => dg .Add("~/Scripts/ReportableConditions/List.js") .Add("~/Scripts/ClientObjects/GridSettings.js")) .OnDocumentReady("bootStrapUI()"); }如果我嘗試直接導航到 javascript 文件,我會收到相同的錯誤:
http://[server]/S7D/Scripts/2012.2.607/jquery-1.7.1.min.js一些奇怪的東西:
- 如果我 IISReset 並點擊 js 文件,它將只處理第一個請求。
- 從伺服器上的另一個(網路表單)站點(相同的應用程序池)請求的任何 js、css 或圖像都可以正常工作。
- 事件日誌中沒有與此 500 錯誤相關的任何內容。
我嘗試向正在執行應用程序池的使用者添加權限完全權限。我還添加了文件權限
$$ Machine $$\IUSR。 這是我的 web.config
<?xml version="1.0" encoding="UTF-8"?> <configuration> <configSections> <sectionGroup name="telerik"> <section name="webAssets" type="Telerik.Web.Mvc.Configuration.WebAssetConfigurationSection, Telerik.Web.Mvc" requirePermission="false" /> </sectionGroup> <sectionGroup name="spring"> <section name="typeAliases" type="Spring.Context.Support.TypeAliasesSectionHandler, Spring.Core" /> <section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web" /> <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> </sectionGroup> <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> </sectionGroup> </configSections> <spring> <context> <!-- Load web.config definition ** This resource reference is essential to define objects in the web.configs --> <resource uri="config://spring/objects" /> <resource uri="assembly://CAS2/CAS2.CASLibDAO/_SpringObjects.xml" /> <resource uri="file://~/App_Data/MvcApplicationContext.xml" /> <resource uri="assembly://P1S.S7D.Core/P1S.S7D.Core.ApplicationContext/ApplicationContext-Common.xml" /> <resource uri="assembly://P1S.S7D.Core/P1S.S7D.Core.ApplicationContext/ApplicationContext-DAO.xml" /> <resource uri="assembly://P1S.S7D.Core/P1S.S7D.Core.ApplicationContext/ApplicationContext.xml" /> <resource uri="assembly://P1S.S7D.Core/P1S.S7D.Core.ApplicationContext/Services.xml" /> <resource uri="assembly://P1S.S7D.Common/P1S.S7D.Common.ApplicationContext/ApplicationContext-AuthModule.xml" /> <resource uri="assembly://P1S.S7D.Common/P1S.S7D.Common.ApplicationContext/ApplicationContext-Web-Common.xml" /> <resource uri="assembly://P1S.S7D.Core/P1S.S7D.Core.ApplicationContext.WCF/ApplicationContext.xml" /> <resource uri="assembly://P1S.S7D.Core/P1S.S7D.Core.ApplicationContext/ApplicationContext-Circular-Reference-IPReporting.xml" /> </context> <objects xmlns="http://www.springframework.net"> <!--cached objects--> </objects> </spring> <system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <pages pageBaseType="P1S.S7D.Web.Mvc.WebViewPage"> <namespaces> <add namespace="P1S.S7D.Web.Mvc" /> <add namespace="System.Web.Helpers" /> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> <add namespace="System.Web.WebPages" /> <add namespace="Telerik.Web.Mvc.UI" /> </namespaces> </pages> </system.web.webPages.razor> <appSettings> <add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="NHibernateSessionFactory" /> <add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.EntityInterceptorObjectName" value="MultiTenantInterceptor" /> <add key="webpages:Version" value="1.0.0.0" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings> <system.web> <sessionState allowCustomSqlDatabase="true" mode="SQLServer" sqlConnectionString="Server=dev-ct-nhsn.dev.rph.int;Database=aspstate;User ID=UID;Password=*****; Application Name=S7DSharedSession" /> <compilation debug="true" targetFramework="4.0"> <assemblies> <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> </assemblies> </compilation> <authentication mode="Forms"> <forms loginUrl="~/Account/LogOn" timeout="2880" /> </authentication> <membership> <providers> <clear /> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> </providers> </membership> <profile> <providers> <clear /> <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" /> </providers> </profile> <roleManager enabled="false"> <providers> <clear /> <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> </providers> </roleManager> <pages pageBaseType="P1S.S7D.Web.Mvc.WebViewPage"> <namespaces> <add namespace="P1S.S7D.Web.Mvc" /> <add namespace="System.Web.Helpers" /> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> <add namespace="System.Web.WebPages" /> <add namespace="Telerik.Web.Mvc.UI" /> </namespaces> <controls> <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </controls> </pages> <httpHandlers> <add verb="GET,HEAD" path="asset.axd" validate="false" type="Telerik.Web.Mvc.WebAssetHttpHandler, Telerik.Web.Mvc" /> </httpHandlers> <httpModules> <add name="AuthenticationModule" type="Web.Handlers.AuthenticationModule,P1S.S7D.Web.Mvc" /> <add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web" /> <add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate31" /> </httpModules> <customErrors mode="Off" /> </system.web> <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules runAllManagedModulesForAllRequests="true"> <add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web" /> <add name="AuthenticationModule" type="Web.Handlers.AuthenticationModule,P1S.S7D.Web.Mvc" /> <add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate31" /> </modules> <!-- --> <handlers> <remove name="asset" /> <add name="asset" preCondition="integratedMode" verb="GET,HEAD" path="asset.axd" type="Telerik.Web.Mvc.WebAssetHttpHandler, Telerik.Web.Mvc" /> </handlers> </system.webServer> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" /> </dependentAssembly> </assemblyBinding> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="NHibernate" culture="neutral" publicKeyToken="aa95f207798dfdb4" /> <bindingRedirect oldVersion="3.1.0.4000" newVersion="3.3.1.4000" /> </dependentAssembly> </assemblyBinding> </runtime> <telerik> <webAssets useTelerikContentDeliveryNetwork="false" /> </telerik> </configuration>所有資源,無論是使用 Telerik 還是使用腳本標籤添加它們都會出現 500 錯誤。控制器和視圖正確顯示(沒有樣式或 javascript)
編輯:
註冊路線:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); RouteTable.Routes.RouteExistingFiles = false; routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); }
正如我在編輯中提到的。問題是我在 IIS 6 Metabase Explorer 中發現的不正確的 IIS 設置。
我使用了 IIS 6 元數據庫資源管理器(是的,我在 IIS 8 站點上使用了它)並且看到了很多不在工作站點中的條目。一個一個刪除後,我發現是我們MSI安裝過程中添加的“scriptMaps”條目導致了問題。這是為了在安裝過程中自動添加萬用字元映射而添加的。它適用於 IIS6,但顯然不適用於 IIS8。
我不確定為什麼文件會在第一個請求時正確提供,但不是後續請求,但刪除條目有效。我在 IIS GUI 的任何地方都找不到“ScriptMaps”設置,但它可能在某處。
當我將網站從本地(Windows 7)發佈到伺服器(Windows 2012)時,我遇到了同樣的錯誤。
我的本地 IIS 添加了以下程式碼:
<staticContent> <mimeMap fileExtension=".woff" mimeType="application/x-font-woff" /> <mimeMap fileExtension=".woff2" mimeType="application/x-font-woff" /> </staticContent>我在 Win 2012 上需要這個的地方
<staticContent> <remove fileExtension=".woff" /> <mimeMap fileExtension=".woff" mimeType="application/x-font-woff" /> <mimeMap fileExtension=".woff2" mimeType="application/x-font-woff" /> </staticContent>似乎Win2012上較新版本的IIS已經添加了.woff,而不是給我任何細節,它只是去了500!