私は、ASP.Net MVCプロジェクトで同じ問題を抱えていました。
<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();
}
}
あなたは、私はアクションが作成されたErrorController.NotFound
にマップされるすべての未知のアクションを処理するために、ベースコントローラ次にIISエラーに
を回避しようとするTrySkipIisCustomErrors
を呼び出すことがわかります。
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
は、このベースコントローラーを継承します。
catch all routeは、他のすべてのルートの後に設定されました。
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
と
Views/Shared
フォルダにページング
Error.cshtml
作成され、彼らは私があなたが探していた何を考えているルートレイアウトへのアクセスの恩恵を受けました。
最終的には、すべてのリクエストがハンドラによって管理され、それに応じてルーティングされるため、もはやそれらの必要性がなくなったので、customErrors
とhttpErrors
を両方とも取り除くことができました。
この構造の元のアイデアは、私のニーズを満たしたソリューションを見つけ出すまで、この記事の中から利用可能なオプションを混ぜ合わせたものです。
Exception handling in ASP.NET MVC (6 methods explained)
は、この情報がお役に立てば幸いです。
私の提案を見て、それがあなたのシナリオに適用できるかどうかを見てください。 – Nkosi