当我使用POST时,为什么Web API操作被发现为GET而404?

时间:2014-09-12 13:18:49

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

我的控制器上有一个名为GetPhotos的动作。当我用适当的参数调用动作作为GET时,动作被调用,一切都很好。 (我使用属性路由)

获取代码

    [Route("getphotos")]
    public IHttpActionResult GetPhotos(string userid, string password, string system, string outstation, string systemno, string version, string compid, string photono)
    {
        //Do some logic here
        return OK();
    }

GET call

GET http://localhost:60672/getphotos?userid=User1++&password=12345&system=UserSystem&outstation=9&systemno=3&version=6.78&compid=mycomputername&photono=003573
HTTP/1.1
User-Agent: Fiddler
Host: localhost:60672
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

但是,当我将操作更改为HttpPost并将我的调用更改为POST调用(通过Fiddler)时,我会返回404。

POST代码

    [HttpPost]
    [Route("getphotos")]
    public IHttpActionResult GetPhotos(string userid, string password, string system, string outstation, string systemno, string version, string compid, string photono)
    {
        //Do some logic here
        return OK();
    }

发布电话

POST http://localhost:60672/getphotos HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Fiddler
Host: localhost:60672
Content-Length: 170
Pragma: no-cache

USERID=User1&PASSWORD=12345&SYSTEM=UserSystem&OUTSTATION=9&SYSTEMNO=3&VERSION=6%2E79&COMPID=mycomputername&PHOTONO=003573

为什么我无法通过POST找到操作?

1 个答案:

答案 0 :(得分:5)

我找到了答案here

显然,我有两件事是错的。我已经习惯了MVC并且正在尝试以MVC方式而不是WebAPI方式来做事。

首先,我需要在我的参数前面使用[FromBody]属性,因为那是我希望从中拉出模型绑定的地方。

但是,似乎WebAPI只允许一个[FromBody]参数用于任何给定的操作。所以,我最后做的是创建一个封装了我所有值的模型,并将我的方法定义更改为:

public IHttpActionResult GetPhotos([FromBody] GetPhotoModel model) { ... }

希望这能让你免于一些同样的挫败感!