【问题标题】:HTTP 405 invalid method (HTTP verb) when using $http.post使用 $http.post 时的 HTTP 405 方法无效(HTTP 动词)
【发布时间】:2017-12-29 21:05:40
【问题描述】:

我在使用 web api 时遇到了一些奇怪的行为。我正在使用属性路由,并在服务器上发帖。 控制器:

    [Route("names")]
    public ResultDTO SaveData(SomeDTO dto)
    {
       //somecode
        ...
    } 

我叫它

     $http.post('/api/mycontroller/names', $scope.model.dto).success(function 
      (data) { ...

它正在工作。但是,如果我重命名我的方法

    [Route("names")]
    public ResultDTO GetData(SomeDTO dto)
    {
       //somecode
        ...
    } 

它不起作用,我收到 HTTP 405 错误您正在查找的页面无法显示,因为尝试访问时使用了无效的方法(HTTP 动词),

但是,如果我将调用从 $http.post 更改为 $http.get,它会起作用

显然,如果我要发布数据,我不会以 GetSomeMethod 开头命名我的方法,但我很好奇,不应该定义路由

   [Route("names")]

使用 $http.post,不管我如何实际调用将处理该帖子的方法?更具体地说,如果我将方法命名为 GetSomething,为什么 $http.post 不起作用,但如果我将方法名称更改为 GotSomething 或 SaveSomething 等,它会起作用?

【问题讨论】:

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


【解决方案1】:

尝试添加路由属性

[HttpPost]

然后您可以根据需要命名您的操作。

Web API 查看 HTTP 方法,然后查找名称以该 HTTP 方法名称开头的操作。例如,对于GET 请求,Web API 会查找以Get... 开头的操作,例如GetContactGetAllContacts。此约定仅适用于 GETPOSTPUTDELETE 方法。

查看更多here

【讨论】:

  • 我已经尝试过了,它正在工作,但我很好奇如果我以 Get 开头命名 mehog,为什么它不起作用?
  • @Error 框架正在使用命名约定。因为方法以 Get 为前缀,所以如果您没有使用动词属性明确说明操作期望的动词,它假定您想要进行 get
  • 但是我的显式 [Route("names")] 不应该告诉 Web API 执行哪个方法,不管我如何命名那个方法?我的意思是,在这个例子中,这是否意味着 Web API 找到了我想要执行的神话,但是由于命名约定,它因为方法名称而拒绝并返回 HTTP 405?
  • 在webapi中你应该指定方法名和http动词
【解决方案2】:

$http.post(***) - [HttpPost]$http.get(***) - [HttpGet] 使用适当的动词

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 2016-03-08
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2018-06-02
    • 2015-02-07
    • 1970-01-01
    相关资源
    最近更新 更多