我正在编写一个 Rest 端点,由于某种原因,rest 调用本身一直返回空内容,即使调试代码显示响应的 Content
是按我预期的方式定义的。对于类似的调用,同样的问题没有表现出来。最终,我意识到成功的调用和失败的调用之间的区别在于,不成功的调用试图返回递归(具有该类型的公共(public)属性/字段的类型)或相互递归类型,而成功的调用则没有。作为我遇到的问题的一个最小示例:
[RoutePrefix("")]
public class LoopyController
{
public class Loopy
{
public Loopy Self {get; set;}
}
[HttpGet]
[Route("loopy")]
public HttpResponseMessage LoopyCall()
{
Loopy loopy = new Loopy();
loopy.Self = loopy;
return Request.CreateResponse(loopy)
}
}
loopy
端点上的 GET
调用返回空响应。我希望它挂起或抛出异常。我想知道为什么 ASP.Net 会出现这种行为。我认识到这个问题的解决方案是修改返回值,使其不再递归,但想知道是否有更简洁的方法来解决这个问题。
编辑:
关于我使用术语“递归类型”的评论中有讨论。我有信心通过https://en.wikipedia.org/wiki/Recursive_data_type Loopy
是一种递归类型。 但是,问题不在于类型Loopy
是递归的,而在于对象loopy
具有循环引用。以下端点:
[HttpGet]
[Route("notsoloopy")]
public HttpResponseMessage NotSoLoopy()
{
Loopy notSoLoopy = new Loopy();
notSoLoopy.Self = null;
return Request.CreateResponse(notSoLoopy);
}
返回响应 {}
以回复 GET
请求。当然 Loopy
是递归的使得 loopy
有一个循环引用。
最佳答案
这是一个循环引用。 WebAPI json 格式化程序默认设置为忽略循环引用。即使您使用的是 XML,我也在想(但不确定)这无论如何都会被忽略。 This article可能会提供一些见解:
Json.net serializer (the serializer used in web api) supports to ignore circular reference on global setting.
关于c# - 递归类型的 ASP.Net 响应为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33633651/