【问题标题】:How to bind parameter when it has reference to itself?引用自身时如何绑定参数?
【发布时间】:2014-12-04 12:02:02
【问题描述】:

这是一个问题。 我们有一个简单的 web api 控制器,里面有一个类

public class CheckApiController : ApiController
{
    public class Test
    {
        public int Id { get; set; }
        public string SomeString { get; set; }
        /*public Test ComplexType
        {
            get
            {
                return new Test()
                {
                    SomeString = "wtf"
                };
            }
        }*/
    }
    public List<Test> Get()
    {
        return new List<Test>(){
            new Test(){Id = 1,SomeString = "1st string"},
            new Test(){Id=2,SomeString = "2nd string"}
        };
    }

    public HttpResponseMessage Post(Test testclass)
    {
        //do something
        var response = Request.CreateResponse(HttpStatusCode.Created);
        return response;
    }
}

当我签入提琴手 GetPost 方法时,一切正常。但是当我取消注释Test 中的属性ComplexType 并重试POST 方法将响应巨大的500 内部服务器错误:

堆栈不足,无法继续安全地执行程序。这可能是由于调用堆栈上有太多函数或堆栈上的函数使用了太多堆栈空间。

所以它的简单 StackOverflow 异常。那么为什么这个错误发生在没有设置器的字段上,或者我如何在绑定中忽略它?

【问题讨论】:

  • 你在 Post 方法中做其他事情吗?
  • 是的。但是没关系,因为调试器没有进入这个方法,并且响应返回内部服务器错误。你在你的机器上试过那个代码吗?

标签: asp.net-mvc asp.net-mvc-4 post asp.net-web-api asp.net-web-api2


【解决方案1】:

想想这里发生了什么。当您发布对象时,WebApi 正在构建您的 Test 类来构建它,它会获取 ComplexType,它会返回一个新的 Test,它会获取 ComplexType,它会返回一个新的 Test,依此类推,直到您用完堆栈。

在模型中包含发送到/从 Api 发送的任何逻辑通常不是一个好主意。这里有一些关于 DTO 的信息,这解释了为什么 http://www.servicedesignpatterns.com/requestandresponsemanagement/datatransferobject

Id 建议修改您的 Test 类,如下所示:

public class Test
{
    public int Id { get; set; }
    public string SomeString { get; set; }
    public Test ComplexType { get; set; }
}

然后分配 'SomeString' 值。

【讨论】:

  • 好的。我明白了。但是为什么POST 请求在普通控制器(MVC)中的行为不会引发这个错误?而且我不知道为什么它被称为“获取”,而目的是“设置”属性。
  • 这只是模型绑定过程的一部分。模型绑定器将检查和分析对象以检查它们是否适合幕后。我发现这篇文章与您的问题相似:stackoverflow.com/a/11860763/692830
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 2016-12-02
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
相关资源
最近更新 更多