我有一个控制器方法,它应该返回一个复杂的对象:
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;
}
}
终于有时间再看一遍了。如果我自己序列化响应,尝试看看会发生什么,这些建议很有帮助。也有一个空json对象。真正的ComplexObject
也有两个属性,但它们是internal
,序列化并没有发现这些属性。把它们公开,一切都好。