Как узнать, является ли запрос ajax в asp.net в Application_Error()

Как узнать, является ли запрос ajax в asp.net в Application_Error()

Я хочу обработать ошибку приложения в Application_Error(). Если запрос является ajax и возникает какое-то исключение, запишите ошибку в файл журнала и верните данные json, содержащие подсказки об ошибках для клиента. В противном случае, если запрос является синхронным и возникает какое-то исключение, запишите ошибку в файл журнала, а затем перенаправьте на страницу ошибки.

но теперь я не могу судить, какой запрос. Я хочу получить "X-Requested-With" из заголовка, к сожалению, ключи заголовков не содержат ключ "X-Requested-With", почему?


person dayulu    schedule 26.09.2011    source источник


Ответы (4)


Тестирование заголовка запроса должно работать. Например:

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>
person Darin Dimitrov    schedule 26.09.2011
comment
Вы уверены, что Context.Request.Headers[x-requested-with] вернет XMLHttpRequest. Я отправляю запрос ajax выше кода, возвращающего ноль. - person dayulu; 26.09.2011
comment
@dayulu, абсолютно точно, код, который я вам показал, был протестирован. С вашим кодом может быть еще одна проблема: если у вас есть какой-то собственный глобальный фильтр, который перехватывает исключения и выполняет перенаправление на страницу с ошибкой, тогда заголовок x-requested-with будет потерян. - person Darin Dimitrov; 26.09.2011
comment
Ты прав! Я получаю null, потому что запрос перенаправляется один раз! Большое тебе спасибо! - person dayulu; 26.09.2011
comment
Это не работает в global.asax. Вместо этого используйте __CALLBACKID. Надеюсь это поможет. - person TheGateKeeper; 16.08.2013

Вы также можете обернуть Context.Request (типа HttpRequest) в HttpRequestWrapper, который содержит метод IsAjaxRequest.

bool isAjaxCall = new HttpRequestWrapper(Context.Request).IsAjaxRequest();
person Marlon Navas    schedule 30.09.2015

можно добавить пользовательские заголовки в ajax-вызов на стороне клиента. См. http://forums.asp.net/t/1229399.aspx/1

Попробуйте поискать это значение заголовка на сервере.

person deostroll    schedule 26.09.2011

Вы могли бы использовать это.

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