【发布时间】:2015-03-20 02:40:51
【问题描述】:
我有一个简单的 ASP.Net Web API 2 控制器:
public class TestController : ApiController
{
[Route("api/method/{msg?}")]
[AcceptVerbs("GET", "POST")]
public string Method(string msg = "John")
{
return "hello " + msg;
}
}
还有一个简单的 HTML 表单来测试它。
<form action="/api/method/" method="post">
<input type="text" name="msg" value="Tim" />
<input type="submit" />
</form>
当我加载页面并提交表单时,结果字符串为"hello John"。如果我将表单的方法从post 更改为get,结果将更改为"hello Tim"。为什么msg 参数在发布到控制器时没有被路由到操作?
========== 编辑 1 ==========
以防万一 HTTP GET 分散注意力,此版本的控制器也无法从发布的表单中接收正确的 msg 参数:
[Route("api/method/{msg?}")]
[HttpPost]
public string Method(string msg = "John")
{
return "hello " + msg;
}
========== 编辑2 ==========
我没有更改默认路由,所以它仍然看起来像这样:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
【问题讨论】:
-
出于兴趣,您为什么对 GET 和 POST 请求使用相同的方法?通常 GET 将用于检索资源,而 UPDATE / POST 将用于修改它。在这种情况下,接受两个动词的方法几乎没有意义 - 如果我不得不对冲赌注,如果你将这两种方法分开,你的问题将不是问题。
-
真正的应用程序可能只使用 POST,但 GET 更容易在浏览器中粘贴为 URL。因此,除非有充分的理由来区分,否则我不会打扰。
-
取决于您是否认为违反 REST 原则是一个很好的理由……我愿意!
-
确实如此,尽管我要问的不是这个。我已经编辑了问题,为您添加了一个仅限 POST 的控制器。
-
您是否更改了默认路由配置?如果是这样,请同时发布。
标签: asp.net-web-api asp.net-web-api2 asp.net-web-api-routing