首页 文章

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

提问于
浏览
2

这是自托管的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 回答

  • 1

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

    More Research: 我有机会再进行一些测试 . 如果帖子的主体是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文档相当稀缺(它还处于测试阶段),但我希望这可以帮助其他可能遇到同样问题的人 .

相关问题