找不到需要POST的简单控制器

自从我将MVC4 webapi beta更新到RC以来,我已经提出了一些以前的问题,希望能够帮助解决这些问题。 现在我得到了最多的,但是这里有一个我还找不出原因。

对于这个简单的控制器,我有一个接受POST和一个接受GET。 当我尝试通过从HTML表单发送请求来运行这些时,只有GET控制器被发现,而POST一个会返回我以下错误。

{ "Message": "No HTTP resource was found that matches the request URI 'http://localhost/webapi/api/play/test'.", "MessageDetail": "No action was found on the controller 'Play' that matches the name 'test'." } 

为什么找不到POST控制器?

控制器

 public class PlayController : ApiController { [HttpPost] // not found public string Test(string output) { return output; } [HttpGet] // works public string Test2(string output) { return output; } } 

HTML表单

 <form action="http://localhost/webapi/api/play/test" method="post"> <input type="text" name="output" /> <input type="submit" name="submit" /> </form> <form action="http://localhost/webapi/api/play/test2" method="get"> <input type="text" name="output" /> <input type="submit" name="submit" /> </form> 

当你想发布“简单”值时,Web.API有点挑剔。

您需要使用[FromBody]属性来指示该值不是来自URL,而是来自发布的数据:

 [HttpPost] public string Test([FromBody] string output) { return output; } 

有了这个改变,你将不会得到404,但output将始终为空,因为Web.Api以特殊格式 (查找发送简单types部分)重新发布值:

其次,客户端需要使用以下格式发送值:

=value

具体而言,名称/值对的名称部分对于简单types必须为空。 不是所有的浏览器都支持HTML表单,但是你可以在脚本中创build这种格式。

所以build议您应该创build一个模型types:

 public class MyModel { public string Output { get; set; } } [HttpPost] public string Test(MyModel model) { return model.Output; } 

那么它将与你的样本来源而不修改你的意见。