2016-07-07 13 views
4

私はカスタムエラーページを取得し、静的なページを使用するだけの方法を探し続けています。静的なページは機能しますが、現時点では避けたいナビゲーションバーを作り直す必要があります。私は現在、カスタムエラーページを指定するために以下を使用しています。レイアウトのあるカスタムエラーページ

Asp.netエラー

<httpErrors errorMode="Custom"> 
    <remove statusCode="404"/> 
    <error statusCode="404" path="/404.html" responseMode="File"/> 
</httpErrors> 

の取り扱い

<customErrors mode="On" redirectMode="ResponseRewrite"> 
    <error statusCode="404" redirect="~/404.aspx"/> 
</customErrors> 

IISエラーがIISのエラーとAsp.netのエラーの両方のために処理することができ、ダイナミックカスタムエラーページを実装する方法はあり取り扱い?

+0

私の提案を見て、それがあなたのシナリオに適用できるかどうかを見てください。 – Nkosi

答えて

1

私は、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.shtmlViews/Sharedフォルダにページング Error.cshtml作成され、彼らは私があなたが探していた何を考えているルートレイアウトへのアクセスの恩恵を受けました。

最終的には、すべてのリクエストがハンドラによって管理され、それに応じてルーティングされるため、もはやそれらの必要性がなくなったので、customErrorshttpErrorsを両方とも取り除くことができました。

この構造の元のアイデアは、私のニーズを満たしたソリューションを見つけ出すまで、この記事の中から利用可能なオプションを混ぜ合わせたものです。

Exception handling in ASP.NET MVC (6 methods explained)

は、この情報がお役に立てば幸いです。

+0

これを行って報告します。ありがとう! –

+0

私はこれを動作させることができた唯一の2つの方法は、ViewResultビュー=新しいErrorsController(this.ControllerContext).NotFound();を使用することでした。これは何らかの理由でオーバーライドメソッドを無視してしまいます。オーバーライドメソッドは、他の方法ではコントローラのnullコンテキストとなってしまいますが、HandleUnknownActionが見つかりました。コード自体はthis.View に依存しているようですが、Viewが型引数を受け入れることができないため、この操作を実行するための検索ができません。 –

+0

特定の項目のために少し微調整して、私はこれがうまくいくことがわかりました。 –

4

私はこれにも苦労し、長い間検索しました。私の知る限り、.netパイプラインに入っていないリクエストに対してIISエラーのために役立つ動的なカスタムエラーページを作成する方法はありません。あなたのように、私は2つの404エラーページを持って終わった。 1つの動的.aspxは、.netパイプラインに入った要求に起因するエラーが見つかりません。.netは、.netパイプラインに入らなかったファイルが見つかりません。あなたの質問を控えめにした人は、おそらくあなたが簡単で解決策がない、とても良い、難しい質問をしていることに気付かなかったでしょう。私は補償するためにあなたの質問をupvoteします。

+0

私は時間を費やしていましたが、静かなページを指し示す答えしか見つけられませんでした。私は正しい質問をしていないかもしれないと心配しました。私の懸念を和らげてくれてありがとう。私は静的なページに固執し、そこからできることをやります! –

+0

@RonC、私の提案を見て、それがこのシナリオに適用できるかどうかを見てください。 – Nkosi

+1

@Nkoshi - あなたのコードを深く掘り下げることなく、すべてのリクエストをドットネットパイプラインにルーティングすることが可能です。このような場合、すべての404は動的.aspxページで処理できます。しかし、パイプラインにルーティングされないIISエラーに対して動的aspxページを提供する方法の根本的な問題は解決しません。また、.netパイプラインを通じたルーチン*すべてのリクエスト(イメージなど)は、多くの開発者が負担したくない(自分自身を含む)サーバーに大きな負担をかけます。私は、エラーを処理するために、パイプラインを通じて.htmlリクエストをルーティングします。 –

関連する問題