Ошибка выполнения: при выполнении пользовательской страницы ошибки возникло исключение.

Я пытаюсь настроить пользовательские ошибки с помощью IIS для приложения .net framework (построенного с использованием Visual Studio 2015, если это уместно). Наш сервер — это сервер Windows 2012 R2. Я просмотрел другие решения этой проблемы, связанные с переполнением стека, но ни одно из них не решило ее. У меня включены пользовательские ошибки в моей веб-конфигурации и в настройках функций диспетчера серверов. Путь к пользовательской странице ошибок (статическая html-страница) задается в диспетчере серверов для всех кодов ошибок. Некоторые предыдущие стеки предлагали отключить python, поэтому я попробовал это, но это ничего не решило. Моя веб-конфигурация выглядит так:

    <?xml version="1.0"?>
<!--other web config-->
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
  </configSections>
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0"/>
    <add key="webpages:Enabled" value="false"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
  </appSettings>
  <system.web>
    <httpRuntime targetFramework="4.5"/>
    <customErrors defaultRedirect="/Views/Home/customError.cshtml" mode="On"/>
    <compilation debug="true"/>
  </system.web>
  <system.webServer>
    <!--<httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="500" subStatusCode="-1" responseMode="ExecuteURL" path="/Views/Home/customError.cshtml" />
    </httpErrors>-->
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed"/>
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <connectionStrings>
    <add name="Entities" connectionString="***" providerName="System.Data.EntityClient"/>
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v12.0"/>
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

Я не видел дублирующегося статического контента в веб-конфигурации. Я добавил все перенаправления страниц ошибок iis непосредственно в диспетчере серверов для приложения.

Когда я запускаю приложение локально и пытаюсь вызвать ошибку 404, я получаю ошибку времени выполнения: при обработке вашего запроса произошло исключение. Кроме того, при выполнении пользовательской страницы ошибки для первого исключения возникло другое исключение. Запрос прекращен. Когда я запускаю его через сервер (также пытаюсь вызвать ошибку 404), он загружается на предыдущую страницу.

Я не уверен, как решить эту проблему. Любое понимание было бы здорово! Спасибо!

Соответствующая часть контроллера:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Net;
using System.Net.Mail;
using BE.Models;
using BE.ViewModels;

namespace BE.Controllers
{

    public class HomeController : Controller
    {

        private Entities db = new Entities();

        // Uri Route: "~/Home"
        // View Route: "/Views/Home/Index.cshtml"
        public ActionResult Index()
        {
            return View();
        }


        // Route: "~/Home/customError"
        // View Route: "/Views/Home/customError.cshtml"
        public ActionResult customError()
        {
            return View();
        }

        public ActionResult About()
        {
            return View();
        }


        public ActionResult Contact()
        {
            return View();
        }



        public ActionResult Resources()
        {
            return View();
        }

    }
}

Я также изменил global.asax.cs, чтобы он выглядел так:

namespace BE
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
        RouteTable.Routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
         new { 
             controller = "Home", 
             action = "Index", 
             id = UrlParameter.Optional
        }
    );
    };
};

Однако это дает мне ошибки сборки.


person Cassie H.    schedule 13.07.2017    source источник
comment
Вы указываете на файл .cshtml вместо правильного HTML-файла. Возможно, проблема в этом?   -  person DavidG    schedule 13.07.2017


Ответы (1)


В MVC можно перенаправить на маршрут, который будет обслуживать страницу. Обычно это обозначается контроллером, а не представлением. Если представление не является статической html-страницей. Поскольку вы используете .cshtml, я предполагаю, что вы обслуживаете контент из контроллера MVC. Ваш раздел должен выглядеть примерно так:

<system.web>
    <!-- Default redirect to the ErrorController index -->
    <customErrors mode="On" defaultRedirect="~/Error">
        <!-- Add any custom methods if you want for other error codes -->
        <error redirect="~/Error/NotFound" statusCode="404" />
    </customErrors>
</system.web>

Также обратите внимание на использование ~/ для обозначения того, что путь является относительным от корня приложения.

Поэтому убедитесь, что в папке ваших контроллеров есть класс, например:

public class ErrorController : Controller {
    // Uri Route: "~/Error"
    // View Route: "/Views/Error/Index.cshtml"
    public ActionResult Index() {
        return View();
    }

    // Route: "~/Error/NotFound"
    // View Route: "/Views/Error/NotFound.cshtml"
    public ActionResult NotFound() {
        return View();
    }
}

В папке Global.asx.cs или там, где маршруты зарегистрированы в папке App_Start, должно быть такое сопоставление маршрутов:

RouteTable.Routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
     new { 
         controller = "Home", 
         action = "Index", 
         id = UrlParameter.Optional 
     }
);

Это должно соответствовать заданным вами маршрутам к нужному контроллеру.

person tigerswithguitars    schedule 13.07.2017
comment
Итак, чтобы уточнить, мне нужно поместить это в мой web.config, и перенаправление по умолчанию должно вести к контроллеру, а не к представлению? - person Cassie H.; 13.07.2017
comment
Я только что изменил файл web.config, чтобы он выглядел следующим образом: ‹customErrors mode=On defaultRedirect=~/Controllers/HomeController.cs› ‹!-- Добавьте любые пользовательские методы, если хотите, для других кодов ошибок --› ‹error redirect=~ /Controllers/HomeController.cs/customError.cshtml statusCode=404 /› ‹/customErrors› Это то, что вы имели в виду? При запуске я получил ту же ошибку, что и раньше. - person Cassie H.; 13.07.2017
comment
Вот и все. Вам понадобится только customErrors часть моего ответа, не удаляйте хорошие вещи, которые у вас уже есть в разделе system.web. Затем убедитесь, что у вас есть контроллер для правильного представления. Также убедитесь, что в конфигурации маршрутов приложения указано что-то вроде "{controller}/{action}/{id}", чтобы маршрут правильно сопоставлялся с контроллером. - person tigerswithguitars; 13.07.2017
comment
‹customErrors mode=On defaultRedirect=~/Controllers/› ‹!-- Добавьте любые пользовательские методы, если хотите, для других кодов ошибок --› ‹error redirect=~/Controllers/HomeController/customError statusCode=404 /› ‹/customErrors› Я также пробовал это, которое также получило ту же ошибку - person Cassie H.; 13.07.2017
comment
Контроллер с именем HomeController сопоставляется с маршрутом контроллера /Home, приложение отбрасывает имя контроллера. Следующая часть маршрута – метод. Таким образом, Home/Get будет отображаться на метод Get() HomeController. - person tigerswithguitars; 13.07.2017
comment
Что вы подразумеваете под конфигурацией корней приложения? Вы имеете в виду перенаправление по умолчанию или перенаправление ошибок, или это конфигурация где-то еще. Меня также немного смущает {controller}/{action}/{id}. Что вы имеете в виду под этим? Я редактирую сообщение, чтобы показать соответствующие части контроллера. - person Cassie H.; 13.07.2017
comment
Хорошо, на этот раз я получил настоящую ошибку 404. Я собираюсь обновить пост с полным контроллером для контекста. Большое спасибо за вашу помощь, кстати! - person Cassie H.; 13.07.2017
comment
Не волнуйтесь. Не забудьте принять ответ, если он был вам полезен :). - person tigerswithguitars; 13.07.2017
comment
Я определенно собираюсь, ха-ха, просто пытаюсь сначала заставить его работать? Я обновил сообщение, чтобы показать изменения в контроллере и global.asax.cs, кстати. - person Cassie H.; 13.07.2017
comment
Я получаю ошибки сборки практически при всех изменениях в файле global.asax. - person Cassie H.; 13.07.2017
comment
Добавили тип к маршрутам... надеюсь, это уже делается где-то в настройках вашего приложения. Извините, да, это не скомпилировалось бы, трудно увидеть, не видя всю вашу кодовую базу. - person tigerswithguitars; 13.07.2017
comment
Я понимаю, что RouteTable.Routes.MapRoute, контроллер, действие и идентификатор не существуют в текущем контексте. Я что-то пропустил. Отредактирую сообщение, чтобы отразить самые последние изменения. Я очень ценю помощь, я работаю над этим уже 2 дня. - person Cassie H.; 13.07.2017
comment
Посмотрите здесь RouteConfig.RegisterRoutes(RouteTable.Routes); это место, где настраиваются эти маршруты :) . Где вы разместили этот код недействителен. Но внутри метода RegisterRoutes вы должны увидеть, о чем я говорю. - person tigerswithguitars; 13.07.2017
comment
Поэтому мне нужно поместить весь код: RouteTable.Routes.MapRoute(Error, {controller}/{action}/{id}, new {controller = Home, action = customError, id = UrlParameter.Optional }); внутри метода registerRoutes? Например, в скобках? - person Cassie H.; 13.07.2017
comment
потому что это сделало все это покрытым красными волнистыми волнами - person Cassie H.; 13.07.2017
comment
.MapRoute("Error", "Error", new { controller = "Home", action = "customError", id = UrlParameter.Optional } ); Второй параметр — это маршрут URI, указанный в web.config других свойствах, указывающих на контроллер и действие. Однако у меня был бы отдельный контроллер для ваших ошибок, как я показал в своем ответе. Тогда маршрут по умолчанию должен работать. - person tigerswithguitars; 13.07.2017
comment
Хорошо, я думаю, это работает? Я получаю ошибку 404, но она находится в файлах, указанных в моем файле web.config. (т.е. ‹customErrors mode=On defaultRedirect=~/Controllers/HomeController.cs› ‹!-- Добавьте любые пользовательские методы, если хотите, для других кодов ошибок --› ‹error redirect=~/Controllers/HomeController/customError.cshtml‌​ statusCode=404 /› ‹/customErrors›0 - person Cassie H.; 13.07.2017
comment
Запрошенный URL-адрес localhost:57292/Controllers/HomeController.cs/‌​?aspxerrorpath =/ah Физический путь C:\Users\663255\Documents\be\BE\Controllers\HomeController.cs\customError.cshtml‌​ - person Cassie H.; 13.07.2017
comment
Не нравятся вышеуказанные пути - person Cassie H.; 13.07.2017
comment
Давайте продолжим обсуждение в чате. - person Cassie H.; 13.07.2017