Вопрос по asp.net-mvc-3, windows-server-2012, web-config – 500 Internal Server Ошибка при запросе любых файлов ресурсов (css, js, images) на сайте .Net MVC 3

8

ОБНОВЛЕНИЕ: Вещи, которые я пытался - см. Ответ ниже для решения

Я установил новый сайт MVC3, и он правильно обслуживал ресурсы. Это устранило настройки machine.config как проблему.Я тогда, когда раздел за разделом в web.config, чтобы увидеть, если какие-либо конкретные изменения в web.config вызвали проблему. Когда конфиги были идентичны, новый сайт все еще работал, а старый сайт все еще не работал.Я удалил IIS, переустановил IIS, а затем снова установил приложения, пытаясь стереть все оставшиеся настройки. Все еще разорили.Затем я использовал publish (вместо msi deploy) в новый каталог. Я использовал опцию iis для «Создать приложение» в новом каталоге с точно таким же кодом, который не работает. Все работало отлично.Я принял права доступа к файлу, поэтому удалил поврежденную папку и переименовал новую рабочую версию в старое имя каталога. Сайт все еще не работал. Это заставило меня предположить, что виноваты некоторые настройки iis, которых нет в machine.config или web.config.Я использовал обозреватель метабазы IIS 6 (да, я использовал его на сайте IIS 8) и увидел довольно много записей, которых не было на рабочем сайте. После удаления одного за другим я обнаружил, что это была запись «scriptMaps», которая добавлялась во время установки MSI, вызывая проблему. Это было добавлено для автоматического добавления сопоставлений подстановочных знаков во время установки. Он работает на IIS6, но, очевидно, не на IIS8.

У нас есть веб-формы и приложение 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-u,i-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

Некоторые странные вещи:

Если я сброслю IIS и нажму на файл 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 или добавление их с тегом script, дают ошибку 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, я могу получить доступ к файлам сразу после перехода к ним. DanCaveman
Вы на самом деле развертываете активы на сервере? Brett
Вы установили пользовательские правила маршрутизации? Andre Calil
@Andre Calil - я добавил маршруты, которые мы регистрируем, к вопросу. Я думаю, что это просто стандартная маршрутизация по умолчанию. Эта точная установка работает на сервере Windows 2003 в QA и Production. DanCaveman
@DanKaufman Обязательно добавьте статический контент при настройке IIS:weblogs.asp.net/anasghanem/archive/2008/05/23/... Andre Calil

Ваш Ответ

3   ответа
4

й настройке IIS, которую я обнаружил в обозревателе метабазы IIS 6.

Я использовал обозреватель метабазы IIS 6 (да, я использовал его на сайте IIS 8) и увидел довольно много записей, которых не было на рабочем сайте. После удаления одного за другим я обнаружил, что это была запись «scriptMaps», которая добавлялась во время установки MSI, вызывая проблему. Это было добавлено для автоматического добавления сопоставлений подстановочных знаков во время установки. Он работает на IIS6, но, очевидно, не на IIS8.

Я не уверен, почему файлы будут обрабатываться правильно при первом запросе, но не при последующих запросах, но удаление записи сработало. Я не смог найти параметр «ScriptMaps» в графическом интерфейсе IIS, но, вероятно, он где-то есть.

Для нас ошибкой было добавление mimemap для статического содержимого в файл web.config (woff), который также должен быть установлен на уровне компьютера в нашей веб-службе Azure. Как только мы сначала добавили элемент удаления, это решило проблему и, следовательно, 500 ошибок. Co7e
Стив - я рад, что вы нашли ошибку. Я знаю, что долго бился головой об стену. Ничего в журналах событий. Надеюсь, это поможет людям избежать всех разочарований, которые у меня были. DanCaveman
21

когда публиковал свой сайт с локального (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>

Кажется, что более новая версия IIS на Win2012 уже добавила .woff, и вместо того, чтобы давать мне какие-либо подробности, она просто пошла 500!

в моем случае мне также пришлось удалить woff2. Garr Godfrey
1

8.0.

После того, как я изменил мини-тип .woff с 'font / x-woff' на 'application / x-font-woff' в IIS, он работает хорошо (после того, как я изменил мини-тип, моя веб-конфигурация добавила '' в staticContent) автоматически)

Похожие вопросы