【问题标题】:How to deserialize ProblemDetails in ASP.NET Core 2.2如何在 ASP.NET Core 2.2 中反序列化 ProblemDetails
【发布时间】:2019-10-31 14:54:25
【问题描述】:

我有一个调用 ASP.NET Core REST 服务的 C# 客户端应用程序。如果服务器上的 REST 服务失败,则将其配置为根据 rfc7807 返回“问题详细信息”json 响应,例如:

{
    "type": "ServiceFault",
    "title": "A service level error occurred executing the action FooController.Create
    "status": 500,
    "detail": "Code=ServiceFault; Reference=5a0912a2-df17-4f27-8e5a-0d4828022306; Message=An error occurred creating a record.",
    "instance": "urn:foo-corp:error:5a0912a2-df17-4f27-8e5a-0d4828022306"
}

在客户端应用程序中,我想将此 json 消息反序列化为 ProblemDetails 的实例,作为访问详细信息的便捷方式。例如:

ProblemDetails details = await httpResp.Content.ReadAsAsync<ProblemDetails>();

但是,反序列化会引发以下异常:

System.Net.Http.UnsupportedMediaTypeException:没有 MediaTypeFormatter 可用于从内容中读取“ProblemDetails”类型的对象 媒体类型为“应用程序/问题+json”。

【问题讨论】:

    标签: asp.net-core


    【解决方案1】:

    ReadAsAsync&lt;T&gt; 不熟悉application/problem+json 媒体类型,并且默认情况下没有可以处理该类型的格式化程序,因此出现错误

    您可以使用长方法并先获取字符串然后使用Json.Net

    string json = await httpResp.Content.ReadAsStringAsync();
    ProblemDetails details = JsonConvert.DeserializeObject<ProblemDetails>(json);
    

    【讨论】:

      【解决方案2】:

      您可以定义一个继承自JsonMediaTypeFormatterProblemDetailsMediaTypeFormatter

          public class ProblemDetailsMediaTypeFormatter : JsonMediaTypeFormatter
          {
              public ProblemDetailsMediaTypeFormatter()
              {
                  SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/problem+json"));
              }
          }
      

      用法:

      var problemDetails = await response.Content
          .ReadAsAsync<ProblemDetails>(new [] { new ProblemDetailsMediaTypeFormatter() }, cancellationToken);
      

      【讨论】:

      • 很好的答案,但是有一个编译时错误。应该是 (new [] { new ProblemDetailsMediaTypeFormatter() }
      猜你喜欢
      • 1970-01-01
      • 2020-03-11
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多