Как узнать, является ли запрос ajax в asp.net в Application_Error()
Как узнать, является ли запрос ajax в asp.net в Application_Error()
Я хочу обработать ошибку приложения в Application_Error(). Если запрос является ajax и какое-то исключение выбрано, напишите ошибку в файле журнала и верните json-данные, содержащие подсказки об ошибках для клиента.
Если запрос синхронизирован и какое-то исключение вызывается, напишите ошибку в файле журнала, а затем перейдите на страницу с ошибкой.
но теперь я не могу судить, какой именно запрос. Я хочу получить "X-Requested-With" из заголовка, к сожалению, ключи заголовков не содержат ключа "X-Requested-With", почему?
Ответы
Ответ 1
Тестирование заголовка запроса должно работать. Например:
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>
Ответ 2
Вы также можете обернуть Context.Request(типа HttpRequest) в HttpRequestWrapper, который содержит метод IsAjaxRequest.
bool isAjaxCall = new HttpRequestWrapper(Context.Request).IsAjaxRequest();
Ответ 3
можно добавить пользовательские заголовки на стороне ajax-клиентской стороны. См. http://forums.asp.net/t/1229399.aspx/1
Попробуйте найти это значение заголовка на сервере.
Ответ 4
Вы можете использовать это.
private static bool IsAjaxRequest()
{
return HttpContext.Current.Request.Headers["X-Requested-With"] == "XMLHttpRequest";
}