【问题标题】:Response Content not Hydrating Object响应内容不是水合对象
【发布时间】:2021-12-02 05:41:07
【问题描述】:

我在 MVC Core 应用的 Controller 中调用 API,如下所示:

HttpContent httpContent = new StringContent(string.Empty, Encoding.UTF8, "text/plain");
HttpResponseMessage response = await client.PostAsync("api/users", httpContent);

if (response.IsSuccessStatusCode) {
    User userJson = await response.Content.ReadFromJsonAsync<User>();                
    string responseContent = await response.Content.ReadAsStringAsync();

responseContent 的值为:

"{
   \"actionName\":\"GetUser\",
   \"routeValues\":{\"id\":\"30131055-9ff0-472f-a147-69e76f7aac77\"},
   \"value\":{\"uid\":\"a36065bd-9d88-4ea3-f04d-08d98cfa8b83\",
   \"email\":\"example@example.org\",
   \"active\":true,\"created\":\"2021-10-12T19:49:16.0054897Z\",
   \"updated\":\"2021-10-12T19:49:16.0054899Z\"},\"formatters\":[],
   \"contentTypes\":[],
   \"statusCode\":201
}"

我没想到这种类型的格式化内容,我期待的是 JSON,但我可以在“值”部分看到我的用户对象的值。

uid、email、active、created 和 updated 的 My User 对象属性都是具有 get/set 方法的公共属性。

所以我可以看到我的数据在那里,但是当我尝试反序列化对 User 对象的响应时,我只看到实例化后的默认值。

我觉得我错过了一些简单的东西。

【问题讨论】:

  • 简单地说:读取两次响应内容是错误的,并且可能会失败,具体取决于您使用的 API 的工作方式。如果你需要这样做,首先读取为字符串,然后从已经在内存中的字符串反序列化

标签: c# json asp.net-core-mvc asp.net-core-webapi dotnet-httpclient


【解决方案1】:

Christian Franco 注意到要返回的对象中的项目与我调用的 API 返回的 CreatedAtActionResult 匹配,而不是我预期的值。这解释了我看到的奇怪行为。

【讨论】:

    【解决方案2】:

    您的 User 类似乎与响应 json 不匹配,您可以像这样创建与响应匹配的类结构

    public class RouteValues
    {
        public string id { get; set; }
    }
    
    public class Value //your user class
    {
        public string uid { get; set; }
        public string email { get; set; }
        public bool active { get; set; }
        public DateTime created { get; set; }
        public DateTime updated { get; set; }
    }
    
    public class Response
    {
        public string actionName { get; set; }
        public RouteValues routeValues { get; set; }
        public Value value { get; set; }
        public List<object> formatters { get; set; }
        public List<object> contentTypes { get; set; }
        public int statusCode { get; set; }
    }
    

    并反序列化到 Response 类并访问与您的用户对象等效的值对象,或者通过指定包含您的用户对象的键(即值键)来反序列化。

    【讨论】:

    • 有趣,这是某种可以用现有工具处理的常见 .NET MVC 响应对象吗?我调用的 API 只返回用户值 - 所以在返回 JSON 数据之前,RouteValues、Value 和 Response 似乎被某种东西包裹起来。
    • 我明白了,我认为可能是 api 正在返回类似于 CreatedAtActionResult 的东西,它将您的用户数据与其他属性一起包装。看docs.microsoft.com/en-us/dotnet/api/…
    • 感谢 Cristian,API 返回了 CreatedAtActionResult 而不是我期望的值。我应该能够纠正这个问题,所以它会返回值。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2019-11-04
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    相关资源
    最近更新 更多