13

Application_Error()のasp.netでリクエストがajaxであるかどうかを知る方法

Application_Error()でアプリエラーを処理したい。リクエストがajaxで、何らかの例外がスローされた場合は、ログファイルにエラーを書き込み、クライアントのエラーヒントを含むjsonデータを返します。それ以外の場合、リクエストが同期であり、何らかの例外がスローされた場合は、ログファイルにエラーを書き込んでから、エラーページにリダイレクトします。

しかし、今はリクエストがどの種類か判断できません。ヘッダーから「X-Requested-With」を取得したいのですが、残念ながらヘッダーのキーに「X-Requested-With」キーが含まれていません。なぜですか?

4

4 に答える 4

23

リクエストヘッダーのテストは機能するはずです。例えば:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult AjaxTest()
    {
        throw new Exception();
    }
}

とでApplication_Error

protected void Application_Error()
{
    bool isAjaxCall = string.Equals("XMLHttpRequest", Context.Request.Headers["x-requested-with"], StringComparison.OrdinalIgnoreCase);
    Context.ClearError();
    if (isAjaxCall)
    {
        Context.Response.ContentType = "application/json";
        Context.Response.StatusCode = 200;
        Context.Response.Write(
            new JavaScriptSerializer().Serialize(
                new { error = "some nasty error occured" }
            )
        );
    }

}

次に、Ajaxリクエストを送信します。

<script type="text/javascript">
    $.get('@Url.Action("AjaxTest", "Home")', function (result) {
        if (result.error) {
            alert(result.error);
        }
    });
</script>
于 2011-09-26T06:59:26.823 に答える
7

メソッドIsAjaxRequestを含むHttpRequestWrapperで(タイプHttpRequestの)Context.Requestをラップすることもできます。

bool isAjaxCall = new HttpRequestWrapper(Context.Request).IsAjaxRequest();
于 2015-09-30T13:45:56.907 に答える
0

クライアント側のajax呼び出しにカスタムヘッダーを追加することが可能です。http://forums.asp.net/t/1229399.aspx/1を参照してください

サーバーでこのヘッダー値を探してみてください。

于 2011-09-26T06:46:14.950 に答える
0

これを使用できます。

    private static bool IsAjaxRequest()
    {
        return HttpContext.Current.Request.Headers["X-Requested-With"] == "XMLHttpRequest";
    }
于 2015-08-25T04:40:25.140 に答える