2011-09-26 14 views
11

はどのように知っている()のApplication_Errorでasp.netでアヤックスがある場合方法を知っています。要求がajaxで、何らかの例外がスローされた場合は、エラーをログファイルに書き込み、クライアントのエラーヒントを含むjsonデータを返します。 それ以外の場合は、要求が同期されていて何らかの例外がスローされた場合は、エラーをログファイルに書き込み、エラーページにリダイレクトします。要求は、要求が、私は()のApplication_Errorでのアプリのエラーを処理するのApplication_Error(中asp.netでアヤックス)</p> <p>がある場合

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

答えて

20

リクエストヘッダーのテストが機能するはずです。

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

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

Application_Errorで:たとえば、あなたがこれを使用することができ

<script type="text/javascript"> 
    $.get('@Url.Action("AjaxTest", "Home")', function (result) { 
     if (result.error) { 
      alert(result.error); 
     } 
    }); 
</script> 
+0

Context.Request.Headers ["x-requested-with"]が "XMLHttpRequest"を返すことを確かめてください。上記のコード戻り値の上にajaxリクエストを送信します。 – dayulu

+1

@dayulu、絶対に、私があなたに示したコードはテストされました。あなたのコードに別の問題があるかもしれません。例外を傍受し、エラーページへのリダイレクトを実行するいくつかのカスタムグローバルフィルタがあると、x-requested-withヘッダーは失われます。 –

+0

あなたは正しいです!リクエストが1回リダイレクトされるため、nullが返されます。どうもありがとうございました! – dayulu

0

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

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

0

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リクエストを送信します。

private static bool IsAjaxRequest() 
    { 
     return HttpContext.Current.Request.Headers["X-Requested-With"] == "XMLHttpRequest"; 
    } 
4

また、メソッドのIsAjaxRequestが含まれているHttpRequestWrapperに(種類のHttpRequestの)Context.Requestをラップすることができます。

bool isAjaxCall = new HttpRequestWrapper(Context.Request).IsAjaxRequest(); 
関連する問題