当HTTP-POST有body时,url参数为null

时间:2012-03-15 22:59:17

标签: c# http post routing asp.net-web-api

这是自托管的RESTful MVC4 Web API,唯一的途径是api/{controller}/{state}。当我发送一个具有正文的HTTP-POST时,state参数为null。如果我删除了主体,则存在状态变量。

我认为它适用于HTTP-POST的方式是url参数被映射,然后body被序列化为额外参数,在这种情况下是数据参数。内容只是字符串数据,我必须编写一个自定义的MediaTypeFormatter(我认为奇怪的是它无法处理常规字符串)。

这是我的控制器签名

public class MyController : ApiController
{
    public void Post(string state, string data)
    {
    }
}

之前是否有人见过这种行为或者可以向我解释为什么身体存在会影响我的url参数?

1 个答案:

答案 0 :(得分:1)

一个解决方案: 我尝试将数据参数更改为复杂类型(只是具有公共属性的类)并将内容作为text / xml而不是text / plain发送,并且它按预期工作。 state参数不为null,我的数据类型为强类型对象。我想MVC希望为http-request体提供像XML或JSON那样的反序列化......

更多研究 我有机会再进行一些测试。如果帖子的主体是XML / JSON,它将首先尝试将body-object的属性映射到方法参数,如此。如果仍然具有未映射的属性,则它将其余属性与方法参数中任何强类型对象的属性相匹配

PostMethod(string p1, string p2, myClass obj) // if myClass has a p3 property it will be mapped from the xml body.
{
}

// xml in body of http-post
<Xml>
   </p1>
   </p2>
   </p3>
</Xml>

如果未映射所有参数,则它将尝试映射url参数。将它直接与我最初的问题联系起来。我现在看到的最好和最简单的解决方案是发送这样的text / xml。

PostMethod(string state, string data)
{
}

<data>put data here</data>

Urlencoded键/值对也能很好地工作。

var r = client.PostAsync(url, new StringContent("data=Something", Encoding.UTF8, "application/x-www-form-urlencoded"));

我最好的猜测是JSON和XML的键/值特性,FormEncoded帮助它映射到参数,这就是它不喜欢普通字符串的原因。

这肯定让我很头疼,我发现MVC4文档相当稀缺(它还处于测试阶段),但我希望这可以帮助其他可能遇到同样问题的人。