2015-07-24 2 views
3

Ниже я использую промежуточное программное обеспечение для настройки страниц ошибок для кодов состояния HTTP от 400 до 599. Таким образом, посещение /error/400 показывает страницу с ошибкой 400 запросов.Отображение страницы 404 не найденной для ASP.NET Core MVC 6

application.UseStatusCodePagesWithReExecute("/error/{0}"); 

[Route("[controller]")] 
public class ErrorController : Controller 
{ 
    [HttpGet("{statusCode}")] 
    public IActionResult Error(int statusCode) 
    { 
     this.Response.StatusCode = statusCode; 
     return this.View(statusCode); 
    } 
} 

Однако посещение /this-page-does-not-exist результатов в общей IIS 404 не найден страницу ошибки.

Есть ли способ обрабатывать запросы, не соответствующие маршрутам? Как я могу обрабатывать этот тип запроса до того, как IIS займется? В идеале я бы хотел отправить запрос /error/404, чтобы мой контроллер ошибок мог его обработать.

В ASP.NET 4.6 MVC 5 нам нужно было использовать раздел httpErrors в файле Web.config для этого.

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="404" /> 
     <error statusCode="404" responseMode="ExecuteURL" path="/error/404/" /> 
    </httpErrors> 
    </system.webServer> 
</configuration> 
+0

Вы можете использовать global.asax и 'protected void Application_Error (отправитель объекта, EventArgs e)', чтобы поймать все ошибки, а затем перенаправить оттуда. Вам нужно будет проверить, является ли это IsAjaxRequest, но в противном случае вы можете перенаправить на основе исключения –

+1

Это ASP.NET 5 Beta 7 MVC 6. Существует не Global.asax. –

+0

Действительно? Ты уверен? Это похоже на то, что вы * * использовали * httpErrors, когда у вас не было * есть *? По умолчанию нет global.asax, просто добавьте один - http://stackoverflow.com/questions/24718640/mvc-6-with-vnext-do-still-need-the-global-asax –

ответ

2

на основе this SO item, IIS получает 404 (и, следовательно, обрабатывает его), прежде чем он достигнет UseStatusCodePagesWithReExecute.

Вы пытались: https://github.com/aspnet/Diagnostics/issues/144? Он предлагает прекратить запрос, который получил 404, поэтому он не переходит к IIS для обработки. И вот код, который нужно добавить к вашему Startup для этого:

app.Run(context => 
{ 
    context.Response.StatusCode = 404; 
    return Task.FromResult(0); 
}); 

Это похоже на проблему с IIS.

+0

Отлично! Я попробую это сегодня вечером. –

+0

Это работает, но когда я пытаюсь использовать '' 'application.UseStatusCodePagesWithReExecute ("/error/{0} ");' '' в связи с этим кодом, я все время получаю 404 ошибки. Есть ли способ сочетания двух? –

+0

Привет @MuhammadRehanSaeed, основанный на [this] (http://www.codemag.com/Article/1501081), 'App.Run()' - это универсальный интерфейс, который запускается, когда ничто в цепочке вызовов не обрабатывает запрос. Поэтому, если 404 возвращается для каждого запроса, может быть что-то еще не так с вашим «Startup.cs». Код выше должен быть в конце вашего запуска. –

Смежные вопросы