【问题标题】:ASP.NET Core 5 - CreatedAtAction not returning any data when returning complex objectASP.NET Core 5 - CreatedAtAction 在返回复杂对象时不返回任何数据
【发布时间】:2021-11-04 21:54:05
【问题描述】:

我有一个控制器方法应该返回一个复杂的对象:

public class ComplexObject {
  public User User {get; set;}
  public Job Job {get; set;}
}

public class User {
  public string UserId {get; set;}
}
public class Job {
  public int Id {get; set;}
}

所以,在我的控制器方法中,我返回的数据如下:

return CreatedAtAction(nameof(GetJob), new { id = jobId }, new ComplexObject { User = new User{ UserId = "hello" }, Job = new Job{ Id = jobId } });

在这里,调用者(一些客户端应用程序,使用 HttpClient)获取一个空的 json 对象。如果我只发回一份工作,或者只是一个用户

return CreatedAtAction(nameof(GetJob), new { id = jobId }, new User { UserId = "hello" });

返回的正文包含我插入的实际对象。

知道我可以做些什么来让完整的ComplexObject 被退回吗?

使用Created 方法和ActionLink 进行了相同的尝试,但故事相同。

完整的控制器方法如下所示(精简到最低限度)

[HttpPost]
[Route("")]
public async Task<IActionResult> Add([FromBody] AddUserParameters obj)
{
    if (!ModelState.IsValid)
        return GenerateBadRequest();
    int jobId = 1;
    var result = new ComplexObject { User = new User { UserId = "hello" }, Job = new Job{ Id = jobId } }
    return CreatedAtAction(nameof(GetJob), new { id = jobId }, result);
}

[HttpGet]
[Route("Job/{id}")]
public async Task<IActionResult> GetJob(int id, bool includeDependentElements = false)
{
    var job = new Job { Id = id };
    return Ok(job);
}

对方调用方法如下

public async Task<ComplexObject>> AddUserWithReload(AddUserParameters obj)
{
    var response = await httpClient.PostAsJsonAsync($"{apiPath}/{usersPath}", obj).ConfigureAwait(continueOnCapturedContext);
    if (response.IsSuccessStatusCode)
    {
        var resultObj = await response.Content.ReadAsAsync<ComplexObject>().ConfigureAwait(continueOnCapturedContext);
        string jobId = response.Headers.Location.Segments.LastOrDefault();
        if (int.TryParse(jobId, out int intJobId))
            ; // do something with it
        return resultObj;
    }
}

【问题讨论】:

  • @CorentinPane The CreatedAtAction method 由 ASP.NET Core 提供。
  • 如果你自己序列化成json,你还会得到一个空的json吗?
  • 您可以发布操作吗?
  • 我有些不明白。为什么调用者和被调用者调用都返回 CreatedAtAction (并且被调用者只返回用户)?调用者(其客户端)不应该使用 HttpClient 向被调用者(服务器)发出请求吗?能否展示一下服务器控制器以及如何从客户端调用它?
  • @StephanSteiner 你也可以显示 HttpClient 调用吗?

标签: c# asp.net-core-webapi


【解决方案1】:

终于有时间再看一遍。如果我自己序列化响应,尝试看看会发生什么的建议很有帮助..也有一个空的 json 对象。真正的ComplexObject 也有两个属性,但它们是internal,并且序列化不会拾取这些属性。将它们公开,一切都很好。

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多