2

jsonp を返す一連のアクションを持つコントローラーがあります。私の問題は、カスタムエラーが有効になっていると、ハードサーバーエラーが発生してもjquery ajax呼び出しが「エラー」にならないことです。そのため、コントローラーのみ、または必要に応じてそのコントローラーの各アクションに対して、カスタム エラー リダイレクトを無効にする必要があります。

これらのアクションでのみエラーが発生したときにリダイレクトを無効にする方法はありますか?

編集:

いくつかのコードで拡張します。まず、カスタム エラーの構成を使用しています。

<customErrors mode="RemoteOnly" defaultRedirect="~/Error/ServerError">
  <error statusCode="403" redirect="~/Error/AccessDenied" />
  <error statusCode="404" redirect="~/Error/NotFound" />
  <error statusCode="500" redirect="~/Error/ServerError" />
  <error statusCode="999" redirect="~/Error/ServerError" />
</customErrors>

次に、独自の例外報告属性があります。この属性は、IController を実装する基本コントローラー クラスに適用されます。私のコントローラーはすべてこのベースコントローラーから継承しているため、サーバーエラーが発生した場合はいつでもエラーレポートが組み込まれています。

public sealed class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        base.OnException(context);
        RaiseErrorSignal(context.Exception);
    }

    private static void RaiseErrorSignal(Exception ex)
    {
        IExceptionHandler handler = Resolve();

        handler.HandleError(ex.GetBaseException());
    }

    private static IExceptionHandler Resolve()
    {
        return ServiceLocator.Locate<IExceptionHandler>();

    }
}

そして、私はこのようなメソッドを持つコントローラーを持っています

public JsonpResult DoSomething(string sessionId /*...more params...*/)
{
    //Do work

    return new JsonpResult() { Data = new { } };
}

このコントローラー/これらのアクションでのみ、リダイレクトを無効にして、エラー コードがクライアントに返されるようにします。エラーは引き続きスローする必要がありますが、何らかの方法でカスタム エラー モードをオフに変更する必要があります。

4

2 に答える 2

3

@frennky から提供された回答を参考にして、少し拡張しました。HTTP レスポンス コードを設定し、jQuery 側のエラー ハンドラに処理させています。

私の場合、すべてのエラーをトラップする ASP.NET カスタム エラー ページを使用する従来の Web フォーム アプリと統合しています。すべての例外が飲み込まれ、jQuery AJAX 呼び出しは正常に完了したように見えました。カスタム エラー ページの HTML が jQuery AJAX 成功関数に返されていました。jQuery が提供するエラー処理を利用する方法が必要でした。このアプローチはその目標を達成します。

ここに私のカスタムHandleErrorAttributeがあります:

public class HandleAjaxErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            base.OnException(filterContext);
            return;
        }
        else
        {
            //Log the error here.
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
            filterContext.HttpContext.Response.StatusDescription = filterContext.Exception.Message;
        }
    }
}

jQuery AJAX リクエストが失敗したときに呼び出される Javascript 関数を次に示します (この例では簡略化しています)。

function HandleAjaxError(jqXHR, textStatus, errorThrown) {
    alert(jqXHR.statusText);
}
于 2011-11-15T21:57:44.043 に答える
1

これらが ajax 呼び出しである場合は、次のようなことを試すことができます。

public sealed class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            base.OnException(context);
            RaiseErrorSignal(context.Exception);
        }
        else
        {
            //Respond to ajax call with error message
        }
    }
    //...
}
于 2011-01-24T21:30:27.930 に答える