0

多くの Ajax 呼び出しに jQuery を使用する asp.net MVC Web アプリケーションがあります。ajax は、ストアド プロシージャでスローされたさまざまな検証例外をキャッチするコントローラーを呼び出します。手順で検証例外が発見された場合、次の構文を使用します

RAISERROR ('VALIDATION ERROR: xyx is required.', 16, 1)

次に、MVC コントローラーが SQL 例外をキャッチし、そこでログを記録してから、新しい例外 (e.Message) を再スローします。

catch (SqlException se)
{
    // logging happens

    // exception get rethrown for ajax error handling
    throw new Exception(se.Message);
 }

そこから、私の ajax エラー ハンドラーが引き継ぎます。

error: function(jqXHR, textStatus, errorThrown) {}

私のローカル Visual Studio Server では、ajax エラー ハンドラーが目的の次の jqXHR.responseTextを取得します。

<html>
<head>
    <title>VALIDATION ERROR: xyx is required.</title>
</head>
 ....

そこからタイトルを解析し、検証エラーを表示します。よく働く。

ただし、コードをホストされた IIS サーバーにデプロイすると、jqXHR.responseText で一般的な 500 応答が返されます。

<html>
<head>
    <title>Runtime Error</title>
</head> ....

何らかの理由で、共有製品サーバーが例外を異なる方法で処理しています。両方の環境で最初の動作を生成する方法を知っていますか?

web.configに次の行を追加しようとしましたが、うまくいきません

<httpErrors errorMode="Custom" existingResponse="PassThrough">
  <remove statusCode="404" subStatusCode="-1" />
  <remove statusCode="502" subStatusCode="-1" />
  <remove statusCode="501" subStatusCode="-1" />
  <remove statusCode="500" subStatusCode="-1" />
</httpErrors>

前もって感謝します

4

1 に答える 1

0

MVC でエラー処理を正しく設定することは、バランスをとる行為の並べ替えです。少なくとも私にとってはそうでした。私の場合、 と の両方でカスタム エラー メッセージを定義することに<system.web><customErrors>なりました<system.webServer><httpErrors>。そしてもちろん、デフォルトErrorHandler(または私の場合ElmahErrorHandler)がGlobal.asax

完全に理解しているふりをするつもりはありませんが、代わりに私が何を使っているかをお見せします。アプリのどこかにもう 1 つピースがあると思っていましたが、現時点では見つかりません。ビューはおそらくその内容を推測できます。モデルを持つ可能性のある 500 を除いて、ほとんどが静的 HTML です。その場合、現在のユーザーの役割に応じて、より詳細なエラー情報を出力します。

httpErrorsまた、アプリが web.config を介して独自のカスタム エラー パスを定義できるように、machine.configのノードのロックを解除する必要がありました。IIS 管理ツールを使用して独自に設定することもできますが (ではなく) 、アプリの ID を照合するweb.configことで実際に に書き込まれます。machine.config

web.config

<system.web>
    <customErrors mode="RemoteOnly">
      <!-- Off, RemoteOnly, On -->
      <error statusCode="400" redirect="~/errors/badrequest"/>
      <error statusCode="404" redirect="~/errors/notfound"/>
      <error statusCode="403" redirect="~/errors/forbidden"/>
      <error statusCode="500" redirect="~/errors/exception"/>
    </customErrors>
</system.web>

<system.webServer>
    <httpErrors errorMode="DetailedLocalOnly">
      <!-- Detailed, DetailedLocalOnly, Custom -->
      <remove statusCode="400" subStatusCode="-1"/>
      <error statusCode="400" path="/errors/badrequest" responseMode="ExecuteURL"/>
      <remove statusCode="403" subStatusCode="-1"/>
      <error statusCode="403" path="/errors/forbidden" responseMode="ExecuteURL"/>
      <remove statusCode="500" subStatusCode="-1"/>
      <error statusCode="500" path="/errors/exception" responseMode="ExecuteURL"/>
      <remove statusCode="404" subStatusCode="-1"/>
      <error statusCode="404" path="/errors/notfound" responseMode="ExecuteURL"/>
    </httpErrors>
</system.webServer>

グローバル.asax

filters.Add(new Elmah.Contrib.Mvc.ElmahHandleErrorAttribute());
// -- OR --
filters.Add(new HandleErrorAttribute());

エラーコントローラー

[AllowAnonymous]
public class ErrorsController : WimsController
{
    public ActionResult Index()
    {
        return RedirectToAction("Index", "Home");
    }

    public ActionResult Exception(HandleErrorInfo error = null)
    {
        return View("Error_500", error);
    }

    public ActionResult NotFound()
    {
        return View("Error_404");
    }

    public ActionResult Forbidden()
    {
        return View("Error_403");
    }

    public ActionResult BadRequest()
    {
        return View("Error_400");
    }
}
于 2013-02-11T23:45:49.783 に答える