- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 webAPI 2 Controller ,目前它正在抛出异常,并且正在通过响应消息将其发送回客户端。 500 内部服务器错误,它自身的异常被序列化,我可以在 fiddler 中看到它的 json 表示。 (json 粘贴在下面)
我一直在尝试找到一种方法将此异常反序列化回 .NET 异常对象,但不断收到错误消息:
"Member 'ClassName' was not found."
目前在我的客户端中,我正在尝试通过以下代码反序列化异常。
if (apiResponse.ResponseCode.Equals(500)) // Unhandled exception on server
{
var exceptionObject = await response.Content.ReadAsAsync<Exception>();
}
如何在客户端应用程序中正确反序列化此异常对象?理想情况下,我应该能够取回原始的 System.InvalidOperationException` 对象。
以下是我尝试反序列化的响应,如在 fiddler 中捕获的那样:
HTTP/1.1 500 Internal Server Error Cache-Control: no-cache Pragma: no-cache Content-Type: application/json; charset=utf-8 Expires: -1 Server: Microsoft-IIS/10.0 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Wed, 30 Sep 2015 13:43:42 GMT Content-Length: 1556
{"Message":"An error has occurred.","ExceptionMessage":"UrlHelper.Link must not return null.","ExceptionType":"System.InvalidOperationException","StackTrace":" at System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult
1.Execute()\r\n at System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult
1.ExecuteAsync(CancellationToken cancellationToken)\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.AuthorizationFilterAttribute.d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()"}
最佳答案
感谢 Serg Rogovtsev 的评论,我现在知道您遇到的不是 Exception
,而是 HttpError
。因此,您必须这样处理:
var exceptionObject = await response.Content.ReadAsAsync<System.Web.Http.HttpError>();
不过,我仍然不认为这是个好主意。 500 状态代码通常意味着出现意外错误并且服务器端没有任何东西可以捕获它。如果您可以控制服务器,我强烈建议您在那里处理此类错误。无论如何,客户端无法对此做任何事情,所以它所需要的只是某种错误通知。
旧答案(在关于 HttpError
的评论之前):
序列化的Exception
看起来像这样:
{
"ClassName":"System.Exception",
"Message":"some exception",
"Data":null,
"InnerException":null,
"HelpURL":null,
"StackTraceString":null,
"RemoteStackTraceString":null,
"RemoteStackIndex":0,
"ExceptionMethod":null,
"HResult":-2146233088,
"Source":null,
"WatsonBuckets":null
}
您所拥有的只是一条格式化的错误消息,其中包含有关异常的信息。
顺便说一句:我不会尝试在客户端捕获服务器端异常。您需要处理服务器上的错误并向客户端提供足够的信息以告知用户发生了什么。
关于c# - WebAPI 如何在 (.NET) 客户端反序列化异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32868163/
我是一名优秀的程序员,十分优秀!