【问题标题】:Web API 2 default routing schemeWeb API 2 默认路由方案
【发布时间】:2015-01-30 05:40:25
【问题描述】:

这个问题突然出现在我的脑海里。

Startup.cs 我有:

HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
app.UseWebApi(config);

当我有这样的方法时:

[RoutePrefix("api/Order")]
public class OrderController : ApiController
{
    // don't use any attribute here
    public IHttpActionResult HelloWorld()
    {
        ...
        return Ok();
    }
}

  1. 可以访问HelloWorld()吗?
  2. 是否应该发送 GETPOST 或任何操作?

【问题讨论】:

    标签: c# routes asp.net-web-api2 asp.net-web-api-routing


    【解决方案1】:

    如果您将方法重命名为:GetHelloWorld(),则可以使用 GET 访问HttpWorld()。 将 POST 重命名为 PostHelloWorld() 也是如此。

    但我更喜欢使用[HttpGet][HttpPost]、... 属性,即使我的操作方法名称中包含“Get”或“Post”字符,以避免可能出现的错误。

    更新

    做了一些测试后,我意识到我的cmets关于那个不能调用HelloWorld的说法不正确。 事实上,如果您对 http://<YourProjectUrl>/order 进行 POST 调用,则可以调用您的 HelloWorld() 方法。

    因此,默认方法将是 POST,并且由于您没有为您的操作方法配置任何 Route(考虑到 RoutePrefix 只是一个前缀,因此需要考虑一个 Route 属性),它会得到您的不带“Controller”的控制器名称(OrderController -> Order)。

    【讨论】:

    • 完全同意。我只是想知道如果不重命名方法名称并添加上述场景中所示的属性会发生什么。
    • @AldourCheng 我不知道我是否理解你。如果您添加属性,它将按预期工作:[HttpGet] 将允许 GET,而 [HttpPost] 将允许 POST,与您的方法名称无关。
    • 是的,我明白这一点,但我要问的是,在不修改我的问题中提供的代码 sn-p 中的任何内容的情况下,HelloWorld() 接受哪些路线和操作?
    • @AldourCheng 好的!我得到了它。我很确定它不会接受任何获取或发布。想一想,允许处理名称中包含“Get”、“Put”或“Post”的方法是 ASP.NET Web Api 框架中添加的一项额外功能,以允许不使用 [HttpGet] 和 [HttpPost] 属性。所以,处理像“HelloWorld()”这样的东西必须我明确地实现。也许,可以扩展一些动作处理程序类来实现它。然而,不是很有用(在我看来)。
    • @AldourCheng 我已经更新了我的答案,因为确实有办法调用你的 HelloWorld() 方法向yoursite/order 发送 POST。对不起我的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 2017-03-24
    相关资源
    最近更新 更多