如何在引用自身时绑定参数?

时间:2014-12-04 12:02:02

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

这是一个问题。 我们有一个简单的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;
    }
}

当我检查fiddler GetPost方法时,一切正常。但是当我在ComplexType中取消注释属性Test并再次尝试POST时,方法将响应巨大的500内部服务器错误:

堆栈不足以安全地继续执行程序。这可能是因为调用堆栈上的函数太多或堆栈上的函数占用太多堆栈空间。

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

1 个答案:

答案 0 :(得分:0)

想想这里发生了什么。当您对POST对象进行POST时,WebApi正在构建您的Test类以构建它,它将获得ComplexType,它返回一个新的Test,它将返回一个新的Test,然后返回一个新的Test,直到你的堆栈用完为止。

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

我建议修改您的Test类看起来像:

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

然后分配&#39; SomeString&#39;之后的价值。