Вызов ajax веб-метода Asp.net показывает трассировку стека и фактическое исключение при включенном режиме пользовательских ошибок - PullRequest
0 голосов
/ 28 сентября 2018

Я вызываю веб-метод с использованием ajax call. Вот пример вызова.

    [WebMethod(true)]
    public static string Save(string customParams)
    {

        throw new ApplicationException("Example Exception");
     }
    $.ajax({
        url: url,
        type: "POST",
        data: data,
        contentType:"application/json; charset=utf-8",
        dataType: props.dataType ? props.dataType : "text",
        error: function (xhr, errorType, ex) {
            debugger;
            err(ex);
        }
    })

Если этот метод выдает исключение, я получаю только 500 внутренних ошибок сервера. Stacktrace пуст и я не могу получитьвнутреннее сообщение об исключении. Я украсил webmethod блоком try catch и вернул HttpException и установил его текст, но это не сработало.

    try
    {
    throw new ApplicationException("Example Exception");

    }
    catch (Exception e)
    {
      throw new HttpException(500,e.Message,e);
    }

Я также попытался это решение снова безудачи.

        catch (Exception e)
        {
            HttpContext.Current.Response.Write(e.Message.ToJsonString());
            HttpContext.Current.Response.StatusCode=500;
        }

Кстати, я также экспериментировал с тем, что необработанное исключение, когда запрос является ajax-запросом, не может быть перехвачено Application_Error Global.asax. Здесь - это проблема.Я выключил пользовательскую ошибку. Теперь она отображает ошибку, но все еще не является намеченным решением.

Любое решение?Заранее спасибо.

1 Ответ

0 голосов
/ 30 сентября 2018

Я нашел какой-то способ добиться этого. Как вы можете заметить, я изменяю 500 errorText с сообщением и трассировкой фактического исключения.

First Clear Response и Header.Then установите TrySkipIisCustomErrors = true, чтобы непозвольте asp.net вернуть страницу ошибки 500. После этого напишите фактическое сообщение об ошибке в ответ, очистите его и завершите обработку страницы. Я действительно не знаю, что это идеальный способ, но до сих пор я получил только это решение.

Вот код.

 public static string ProcessAjaxException(Exception ex)
        {
            if (!HttpContext.Current.Request.IsAjaxRequest())
            {
                return null;
            }
            var page = (Page)HttpContext.Current.CurrentHandler;
            string url = page.AppRelativeVirtualPath;
            Framework.Core.Logging.LoggerFactory.Error(url, ex);
            var jsonExceptionDetails = new { ex.Message, ex.StackTrace, statusText = "500" };
            var serializedExcpDetails = JsonConvert.SerializeObject(jsonExceptionDetails);
            //Erases any buffered HTML output.
            HttpContext.Current.Response.Clear();
            //Erases header
            HttpContext.Current.Response.ClearHeaders();
            /*If the IHttpResponse::SetStatus method was called by using the fTrySkipCustomErrors flag, 
             * the existing response is passed through, 
             * and no detailed or custom error is shown.*/
            HttpContext.Current.Response.TrySkipIisCustomErrors = true;
            HttpContext.Current.Response.ContentType = "application/json; charset=utf-8";
            HttpContext.Current.Response.StatusCode = 500;
            //Send all buffered output to client 
            HttpContext.Current.Response.Flush();
            HttpContext.Current.Response.Write(serializedExcpDetails);
            //Stop processing the page
            HttpContext.Current.Response.End();
            return null;
        }
...