【问题标题】:Why is HttpGet required only for some actions?为什么只有某些操作需要 HttpGet?
【发布时间】:2015-01-21 21:59:54
【问题描述】:

让我先概述一下情况:

我有一个看起来像这样的基本控制器:

public class SearchRequestController : ApiController
{
    public IEnumerable<ObjectA> GetAllRequests() {...}
    {}
    public IEnumerable<ObjectA> GetLatestRequest() {...}
    {}
}

使用以下路由

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

我可以轻松使用以下功能

 Http://myServer/myvirtualdirectory/api/SearchRequest/GetAllRequests
 Http://myServer/myvirtualdirectory/api/SearchRequest/GetLatestRequest

现在我想添加以下控制器

 public class UserController : ApiController
 {
    public IEnumerable<UserObject> SearchUsersByInput() {...}
 }

但是下面的 GET 不起作用

 Http://myServer/myvirtualdirectory/api/User/SearchUsersByInput

 I'm getting a 405: {"Message":"The requested resource does not support http method 'GET'."} 

但是,当我按如下方式更改我的功能时,它会起作用:

 public class UserController : ApiController
 {
  [HttpGet]
  public IEnumerable<UserObject> SearchUsersByInput() {...}
 }

问题: 有人可以解释这种行为的起源吗?我做错了什么还是我的路由有问题?

【问题讨论】:

  • 它没有被拾取,因为你没有指定属性也没有遵循命名约定。
  • @JeroenVannevel 谢谢回复。你引用的属性是[HttpGet] 对吗?

标签: c# asp.net-web-api


【解决方案1】:

请参考帖子here

您将看到您可以使用命名约定(这就是名称中带有 Get 的方法起作用的原因),或者您可以通过使用正确的 HTTP 属性装饰操作来显式指定操作的 HTTP 方法。

【讨论】:

  • 确实了不起。将函数名从 SearchUsersByInput() 更改为 GetUsersByInput() 确实为我解决了这个问题。
  • 呃。 WebAPI 中神奇的命名约定让我印象深刻。
【解决方案2】:

这是 asp.net 中 Web 服务的默认行为 - 它们不支持 GET 方法,除非明确指定它们应该这样做。

所以只需使用[HttpGetAttribute] 的方法需要通过http 支持GET

表示用于限制操作方法的属性,以便该方法仅处理 HTTP GET 请求。

【讨论】:

  • 感谢信息。一些关于[HttpGetAttribute] 的进一步阅读确实给了我很多关于路由的理想信息。
猜你喜欢
  • 2013-03-24
  • 2013-07-12
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多