在 ajax 调用中从服务层检索自定义异常消息

Retrieve Custom exception message from service layer in ajax call

我使用 ServiceStack 框架在 ASP.net MVC5 中开发了我的应用程序。在我的应用程序中,单击按钮后,我进行 ajax 服务器调用,其中 returns 数据。

this.LoadData = function(){
    $.ajax({
        url: '@Url.Action("SearchCustomer", "Customer")',
        cache: false,
        type: 'GET',
        contentType: 'application/json',
        data: { 'IndexNo': this.IndexNo },
        success: function (result) {
        },
        error: function (xhr, status, error) {
        }
    });
}

在某些情况下,我的服务层抛出异常(据我所知应该序列化到 Response DTO 的 ResponseStatus 对象中)。在上面 ajax 调用的错误函数中,我想检索我的服务层抛出的自定义异常消息。我怎样才能做到这一点?上面的状态和错误包含序列化的 ResponseStatus 信息,即 "Internal server error"、错误代码 500 等。我想要的是我的服务层抛出的自定义错误消息。

我认为您找不到一个简单的解决方案来从 MVC5 应用程序生成和 returning 异常。但是,有许多 post 与此主题相关的答案:

...这是一篇博客 post,其中提供了一些额外的细节:

http://www.dotnetcurry.com/showarticle.aspx?ID=1068

一旦你弄清楚了如何为 javascript 客户端生成和 return 异常,只需在客户端解析响应以提取你在服务器上创建的异常详细信息.如果您不确定上面的错误处理程序中的变量是什么,您可以使用 Chrome/Firefox/IE/etc.

中可用的任何 javascript 调试工具来检查它们

您应该能够将错误响应正文解析为 JSON 并通过以下方式访问 ResponseStatus

error: function (xhr, status, error) {
    try {
        var response = JSON.parse(xhr.responseText);
        console.log(response.ResponseStatus);
    } catch (e) { }
}

为了解决我的问题,我做了以下操作:

  1. 我在我的控制器方法中处理了 WebServiceException,并在 catch 块中通过填写所需的详细信息(主要是来自服务器的自定义异常消息)重新抛出异常。 控制器方法用"HandleExceptionAttribute"

    修饰
    [HandleExceptionAttribute]
    public JsonResult SearchCustomer(string IndexNo)
    {
        var client = new JsonServiceClient(ConfigurationManager.AppSettings["baseURL"]);
        GetCustomerResponse response = null;
    
        CustomerViewVM viewVM = null;
        try
        {
            response = client.Get<GetCustomerResponse>(<RequestDTOObjet>);
    
            viewVM = response.ToViewCustomerVM();
        }
        catch(WebServiceException ex)
        {
            Exception e = new Exception(ex.ErrorMessage);
            e.Data.Add("Operation", "View Customer");
            e.Data.Add("ErrorCode", ex.StatusCode);
    
            throw e;
        }
    
        return Json(viewVM, JsonRequestBehavior.AllowGet);
    }
    
  2. 写了 "HandleExceptionAttribute"。在这里,我将异常消息包装为 Json 对象并设置状态代码。

    public class HandleExceptionAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null)
            {
                if (filterContext.Exception.Data["ErrorCode"] != null)
                {
                    filterContext.HttpContext.Response.StatusCode = (int)Enum.Parse(typeof(HttpStatusCode), 
                                                                        filterContext.Exception.Data["ErrorCode"].ToString());
                }
    
                filterContext.Result = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        filterContext.Exception.Message,
                    }
                };
                filterContext.ExceptionHandled = true;
            }
            else
            {
                base.OnException(filterContext);
            }
        }
    }
    
  3. 然后在我的 ajax 调用错误函数中,我解析 json 对象,该对象包含有关自定义错误消息的信息(我已在 [=38= 属性中设置) ])

    error: function (xhr, textStatus, errorThrown) {
         var err = JSON.parse(xhr.responseText);
         var msg = err.Message;
    }
    

这就是我设法从我的服务层获取自定义错误消息的方法。希望这是应该做的。如果这里的专家对上述解决方案有任何建议,请发表评论。

Mythz 和 Sam 感谢您的回答。