Я бы не использовал Global.asax. Когда вы решите использовать ASPNETcore в будущих проектах, он больше не будет вам доступен. Однако защищенное переопределение void OnException (ExceptionContext filterContext) {} будет, и оно используется в вашем контроллере.

м приложении asp.net mvc я хотел бы показать пользователю сообщение об ошибке, которое использовалось для создания исключения. Исключение происходит в запросе ajax. Я попробовал это:

В файле Global.asax.cs у меня есть глобальный обработчик ошибок приложения:

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = System.Web.HttpContext.Current.Server.GetLastError();

    // do something so that client side gets the value exception.Message
    // I have tried these, but no success
    HttpContext.Current.Response.StatusDescription = exception.Message;
    HttpContext.Current.Response.StatusCode = 1000;  // custom status code
}

В JavaScript у меня есть глобальный обработчик ajaxError:

$(document).ajaxError(function (xhr, props) {
    // show the message in the exception thrown on the server side
});

Я пытался получить сообщение об исключении в JavaScript, используяprops.statusText, props.responseText, но ни у одного из них не было сообщения об исключении.

Мой вопрос: Что я могу сделать вApplication_Error метод, чтобы я мог получить сообщение, содержащееся вexception.Message к глобальномуajaxError функционировать на стороне клиента? Обратите внимание, что я легко могу обработать исключение, которое возникает в любом конкретном действии, когда выполняется запрос ajax, но я хотел бы создать глобальный обработчик исключений, который позволит мне просто вызвать исключение с сообщением из любой части моего приложения, и сообщение об исключении показывается пользователю на стороне клиента.

я пыталсяэто, но это не решает мою проблему, потому что я хочу использовать глобальный jQueryajaxErrorвместо того, чтобы обрабатывать ошибку только в конкретном запросе ajax. Можно ли это изменить, чтобы добиться того, чего я хочу?

Ответы на вопрос(1)

Вы можете создать базовый контроллер и переопределитьOnException метод

public class BaseController : Controller
{
    protected override void OnException(ExceptionContext filterContext)
    {
        //your existing code to log errors here

        filterContext.ExceptionHandled = true;
        if (filterContext.HttpContext.Request.Headers["X-Requested-With"]
                                                                 == "XMLHttpRequest")
        {

            filterContext.Result = new JsonResult
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                Data = new
                {
                    Error = true,
                    Message = filterContext.Exception.Message
                }
            };
            filterContext.HttpContext.Response.StatusCode = 500;
            filterContext.ExceptionHandled = true;
        }
        else
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
                {{"controller", "Error"}, {"action", "Index"}});
        }
    }
}

и все ваши контроллеры наследуют от этого

public class HomeController : BaseController
{

}

Таким образом, каждый раз, когда происходит исключение в ваших контроллерах, этоOnException Метод будет выполнен, и если это AJAX-запрос, он возвращает JSON-ответ с приведенной ниже структурой

{
  Error : true,
  Message : "The message from the exception caught"
}

и теперь в вашем JavaScript, подключите глобальныйajaxError событие, и вы можете прочитать ответ от сервера и проанализировать его в объект js, а затем прочитатьMessage свойство

$(document).ready(function() {

    $(document).ajaxError(function (event, request, settings) {           
        var d = JSON.parse(request.responseText);
        alert("Ajax error:"+d.Message);               
    });

});
 Sнаđошƒаӽ02 окт. 2017 г., 21:22
Я уже пробовал подобный код, но безуспешно. Возможно, я не использовал это правильно. Во всяком случае, у меня есть вопрос, с этим кодом на месте, нужно ли мне избавиться от Application_Error в Global.asax?
 Jason Roner02 окт. 2017 г., 21:50
Я бы не использовал Global.asax. Когда вы решите использовать ASPNETcore в будущих проектах, он больше не будет вам доступен. Однако защищенное переопределение void OnException (ExceptionContext filterContext) {} будет, и оно используется в вашем контроллере.

Ваш ответ на вопрос