在 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) { }
}
为了解决我的问题,我做了以下操作:
我在我的控制器方法中处理了 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);
}
写了 "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);
}
}
}
然后在我的 ajax 调用错误函数中,我解析 json 对象,该对象包含有关自定义错误消息的信息(我已在 [=38= 属性中设置) ])
error: function (xhr, textStatus, errorThrown) {
var err = JSON.parse(xhr.responseText);
var msg = err.Message;
}
这就是我设法从我的服务层获取自定义错误消息的方法。希望这是应该做的。如果这里的专家对上述解决方案有任何建议,请发表评论。
Mythz 和 Sam 感谢您的回答。
我使用 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) { }
}
为了解决我的问题,我做了以下操作:
我在我的控制器方法中处理了 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); }
写了 "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); } } }
然后在我的 ajax 调用错误函数中,我解析 json 对象,该对象包含有关自定义错误消息的信息(我已在 [=38= 属性中设置) ])
error: function (xhr, textStatus, errorThrown) { var err = JSON.parse(xhr.responseText); var msg = err.Message; }
这就是我设法从我的服务层获取自定义错误消息的方法。希望这是应该做的。如果这里的专家对上述解决方案有任何建议,请发表评论。
Mythz 和 Sam 感谢您的回答。