c# - 递归类型的 ASP.Net 响应为空

标签 c# asp.net asp.net-web-api

我正在编写一个 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/

相关文章:

c# - 我可以将 .NET 5 COM 互操作对象与 VB6 连接吗?

azure - 使用 Azure AD 身份验证保护的 WebAPI 无法在 IIS 上工作,但在使用 Visual Studio 的 IIS Express 上工作正常

c# - 在自定义AuthorizeAttribute中获取Post请求参数

c# - 无法从 List 转换为 EntityCollection

asp.net - ASP.NET:获取页面的文件名

asp.net - 如何从 aspx 页面引用母版页?

.net - 将 .NET Core 应用程序部署为 Docker 化容器的好处?

javascript - 启用了 CORS 但仍然得到 405

c# - 仅向 SQL 表插入新数据

c# - 在 C# 中对具有两个属性的对象实现 IEqualityComparer<T>