2012-12-12 6 views
11

ASP.NET MVC 4アプリケーションでエラーが発生した場合、エラーの種類に応じてユーザーのビューをカスタマイズしたいと考えています。たとえば、ページが見つからないか、例外が発生しています(例外についてのユーザーフレンドリーな詳細があります)。私はStackOverflowや他のオンラインソースでこれを行う方法の他の例を調べましたが、答えのどれも私のために働いていません。ASP.NET MVC 4 - 例外処理が動作しない

基本的な[HandleError]属性は、.NET 4.5をターゲットとするMVC 4アプリケーションを使用するVS2012では機能していないようです。ここで私は私のホームコントローラを持っているコードは次のとおりです。

[HandleError] 
public ActionResult Index() 
{ 
    Response.TrySkipIisCustomErrors = true; //doesn't work with or without this 
    throw new NullReferenceException("Uh oh, something broke."); 
} 

それはちょうど例外をスローして、と私はデフォルトの〜/共有/ Error.cshtmlビューがあるため、[のHandleError]属性を返されることを期待します、しかし私が得るのは、ページを表示できないことを示すHTTP 500 Internal Server Errorです。私はweb.configをチェックして、さまざまな設定が奇妙な動作をしているようです。セクションでは、現在含まれています

<customErrors mode="On" /> 

は(私も=「OFF」をdefaultRedirectでの追加とのcustomErrorsモードで試してみたが、それがどんな効果を持っていなかった...共有エラービューまたはどちらをCustomErrorsビューをレンダリングしていますが、customErrorsモードをoffに変更すると、例外の詳細が予想どおりに表示されるため、「Uh oh、something broken」例外が発生します。

私も試しましたOnExceptionハンドラをHomeControllerに追加すると、デバッグしてOnExceptionイベントが発生していることがわかりますが、違いはありません。

protected override void OnException(ExceptionContext filterContext) 
{ 
    base.OnException(filterContext); 
    filterContext.ExceptionHandled = true; 
    if (filterContext == null) 
    { 
     filterContext.Result = View("CustomError"); 
     return; 
    } 
    Exception e = filterContext.Exception; 
    // TODO: Log the exception here 
    ViewData["Exception"] = e; // pass the exception to the view 
    filterContext.Result = View("CustomError"); 
} 

私はまた、ビューを指定し、[のHandleError]変更しようとしたが、それはどちらか何もしていないようだ。

[HandleError(View="CustomError")] 

すべてのヘルプははるかに高く評価されるだろう。詳細が必要な場合はお知らせください。 customErrorsタグに次の属性を追加すること

答えて

4

私は非ローカルホストのIPアドレス(通常は別のコンピュータ)からページを呼び出さなければならないことを思い出しています。そしてそれはIISベースのサーバーでなければなりません。組み込みの開発サーバー(IISやIIS Expressですが、外部アクセス用にIIS Expressを設定する必要があります)は苦痛です。

実際にデバッグすることができます。デバッグコンピュータのローカルサーバーを外部要求を受け入れ、リモートサーバーからローカルサーバーに呼び出すように構成する必要があります。

+1

web.configのどこにでも 'RemoteOnly'を使用していませんが、私の元のコードはローカルではなくリモートで動作するようです!それは私には非常に驚きです。ビューをレンダリングするために、 ''をweb.configの ''セクションに追加する必要がありましたが、それは正常です。これにより、ローカルでデバッグするのが難しくなり、 'mode = RemoteOnly'が使用されていないため、バグのように見えます。誰かがこれをローカルで動作させる方法を見つけたら、教えてください。 (私は具体的には2番目の質問を開くかもしれません。) –

1

試してみてください。

defaultRedirect="Error" 

これは、明示的にエラーがスローされ、何のビューは、属性にデフォルトで指定されていない場合、MVCは、ユーザーをリダイレクトする必要があります表示するかを定義します。これはもちろんError.cshtmlSharedビューフォルダに存在する場合にのみ動作します。

+0

私はついにこの提案を試しています。 ''を使用した場合、共有エラービューのコンテンツではなくPageNotFoundエラーページが返され、ViewDataに例外データはありませんでした。私はこれは/ Errorが実際にサーバー上に存在せず、web.configが実際のビューについて何も知らないためだと考えましたが、 "Error"ビューを使用するようにOnExceptionハンドラを変更したときに、同じHTTP 500エラーが発生していましたが、PageNotFoundページが表示されなくなりました。 : –

5

私はまた、結局のところ無限の旅をしていましたので、カスタムのエラーページを取得しようとすると、ブログの投稿を読んでいます。以下は最終的に私のために働いたものです。

最初のステップでは、組み込みのCassini WebサーバーではなくデバッグにIIS Expressを使用して、デバッグ環境が実際の環境を反映することを「保証」します。

アプリケーションエラーを処理し、処理するカスタムエラーごとにアクションを追加するコントローラを作成します。アクションはロギングを行い、ステータスコードを設定し、ビューを返す必要があります。

public class ErrorsController : Controller 
{ 
    // 404 
    [HttpGet] 
    public ActionResult NotFound() 
    { 
     Response.StatusCode = (int)HttpStatusCode.NotFound; 
     return View(); 
    } 

    // I also have test actions so that I can verify it's working in production. 
    [HttpGet] 
    public ActionResult Throw404() 
    { 
     throw new HttpException((int)HttpStatusCode.NotFound, "demo"); 
    } 
} 

カスタム・エラー・アクションにリダイレクトするようにweb.configファイルでcustomErrorsセクションを設定します。

<system.web> 
    <customErrors mode="RemoteOnly" defaultRedirect="Errors/InternalServerError"> 
     <error statusCode="400" redirect="Errors/BadRequest" /> 
     <error statusCode="403" redirect="Errors/Forbidden" /> 
     <error statusCode="404" redirect="Errors/NotFound" /> 
     <error statusCode="500" redirect="Errors/InternalServerError" /> 
    </customErrors> 

system.webServerhttpErrorsセクションを追加し、web.configファイルで詳細にerrorModeを設定します。なぜこの作品は私にとって謎なのですが、これが鍵です。

<system.webServer> 
    <httpErrors errorMode="Detailed" /> 

最後に定義されたルートにcatchallルートを追加して、404をカスタムページに誘導します。

  // catchall for 404s 
     routes.MapRoute(
      "Error", 
      "{*url}", 
      new {controller = "Errors", action = "NotFound"}); 

また、カスタムHandleErrorAttributeを作成して、500エラーを記録するためのグローバルフィルタとして登録することもできます。

これらの手順は、開発環境(IIS Express)と運用環境(IIS7)の両方で役に立ちました。開発の効果を確認するには、customErrors mode="On"を変更する必要があります。

+0

私はチェックし、Project Properties> Webから、IIS Expressをチェックして「Local IIS Web Serverを使用する」にデフォルト設定されていたので、残りの部分をチェックするのに少し時間がかかります。 –

+1

404のためのキャッチオールルートWebサーバーの設定を変更し、ErrorsControllerを作成し、Errors/{Action}ルートをフックアップすると、期待どおりに動作しないように見えます。IISサーバーがエラー/ に正しくリダイレ​​クトしていないかのようですエラーコードに移動しますが、 'Response.StatusCode'を設定してもカスタムページが表示されません。StatusCodeを削除するとカスタムページが表示されますが、 –

+0

リダイレクトがうまくいかない理由が見つかった場合は、この方法を実行することができます(例:/blah)。実際の例外をInternalServerErrorビューに渡してカスタムエラーページをレンダリングすることができない場合があります)。 –

1

私は同様の問題に直面し、何か起こっていることを解決しようとしていました。だから、もし他の人が同様の問題に直面した場合には、私の問題は何だったのでしょうか。

エラーページで_Layoutページを使用しようとしました。 Error.cshtmlページには、

@ { Layout = null; }

関連する問題