У меня есть одна и та же проблема в проектах ASP.Net MVC, прокладывая все через .Net через обработчики.
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*.*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*.*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*.*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
Первый ErrorController
был создан для обработки ошибок запроса и не найдены запросы нравится.
[AllowAnonymous]
public class ErrorController : Controller {
// GET: Error
public ActionResult NotFound() {
Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
Response.TrySkipIisCustomErrors = true;
HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
HttpContext.Response.TrySkipIisCustomErrors = true;
return View();
}
public ActionResult Error() {
Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
Response.TrySkipIisCustomErrors = true;
return View();
}
}
Вы заметите, что я называю TrySkipIisCustomErrors
, чтобы попытаться избежать ошибок IIS
Затем базовый контроллер для обработки всех неизвестных действий, которые сопоставляют к ErrorController.NotFound
действий была создана.
public abstract class FrontOfficeControllerBase : Controller {
protected override void HandleUnknownAction(string actionName) {
var data = ViewData;
//Custom code to resolve the view.
//ViewResult view = this.View<ErrorController>(c => c.NotFound());
//Manually create view with view Data
ViewResult view = new ViewResult();
view.ViewData = new ViewDataDictionary();
view.ViewData["controller"] = "Error";
view.ViewData["action"] = "NotFound";
if (data != null && data.Count > 0) {
data.ToList().ForEach(view.ViewData.Add);
}
Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
Response.TrySkipIisCustomErrors = true;
view.ExecuteResult(this.ControllerContext);
}
}
Все Controllers
унаследовали бы от этого базового контроллера.
Улавливать весь маршрут был настроен после всех других маршрутов.
routes.MapRoute(
name: "404-NotFound",
url: "NotFound",
defaults: new { controller = "Error", action = "NotFound" }
);
routes.MapRoute(
name: "500-Error",
url: "Error",
defaults: new { controller = "Error", action = "Error" }
);
routes.MapRoute(
name: "CatchAll",
url: "{*any}",
defaults: new { controller = "Error", action = "NotFound" });
Это сделано в том, что если маршрут не соответствует ни одному из моих контроллеров это будет безопасно путь к ErrorController.NotFound
действия.
Для взглядов, я создал соответствующий NotFound.shtml
и Error.cshtml
выгружаемых в папке Views/Shared
, и они воспользовались доступом к корневому макету, что то, что я думаю, что вы искали.
В конце концов, я был в состоянии удалить как customErrors
и httpErrors
из web.config
, как там уже не было никакой необходимости в них, как каждый запрос управлял обработчиками и направляется соответственно.
Исходная идея для этой структуры взята из этой статьи, где я смешивал и сопоставлял доступные варианты, пока не нашел решение, которое работало/соответствовало моим потребностям.
Exception handling in ASP.NET MVC (6 methods explained)
Надеется, что это помогает.
Взгляните на мое предложение и посмотрите, можно ли его применить в вашем сценарии. – Nkosi