Web API 2.2 客户端和反序列化 HttpError 对象

Web API 2.2 Client and deserializing HttpError objects

背景 - 我有一个 .Net 4.5 WPF 客户端应用程序。 WPF 客户端应用程序使用 Web API 2.2 Client libraries 从 asp.net web api 服务加载数据。这一切都有效。

我的问题是关于错误处理的。

asp.net web api 服务 returns HttpError 对象发生错误时的错误处理。您可以在 fiddler 中通过网络看到它们,例如:

{ 
  "Message": "An error has occurred.", 
  "ExceptionMessage": "Index was outside the bounds of the array.", 
  "ExceptionType": "System.IndexOutOfRangeException", 
  "StackTrace": "   at WebApiTest.TestController.Post(Uri uri) in c:\Temp\WebApiTest\WebApiTest\TestController.cs:line 18\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClassf.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)\r\n   at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)" 
}

出错时正确返回给客户端,这里没问题。

问题 - 我的问题是关于反序列化这些错误。 HttpError 对象在 System.Web.Http 程序集中定义,它是 Web API 核心的一部分。由于我只是使用不依赖于 System.Web.Http 的 Web API 客户端库,因此 class 不可用。因此我像这样反序列化错误:

error = response.Content.ReadAsAsync<RestError>().Result;

其中 RestError 是 class 我在我的应用程序中本地定义的。

public class RestError
{
  public string ExceptionMessage { get; set; }
  public string ExceptionType { get; set; }
  public string Message { get; set; }
  public string StackTrace { get; set; }
}

以上有效,但由于 HttpError class 的重复而感觉不对。

是否有比为 HttpError 定义我自己的 class 或将完整的 Web API Core 添加到我的 WPF 应用程序更好的解决方案?

不,你的方式很好。添加 Web API 核心对您的客户端应用程序没有意义,因为它仅适用于 server/service 应用程序。