使用RoutePrefix的Web API中的属性路由 - 奇怪的错误

时间:2014-06-09 09:35:16

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

    [RoutePrefix("ServiceRequest")]
    public class ServiceRequestController : ApiController
    {
        [HttpPost]
        [Route("")]
        public IHttpActionResult Post([FromBody]ServiceRequest.Models.ServiceRequest serviceRequest)
        {
            return Ok();
        }
    }

我在Route()中为POST使用空WebAPI并调用

`http://localhost.com:59985/ServiceRequest/

这会引发一个错误,指出HTTP Error 405.0 - Method Not Allowed并且最有可能的原因是

  • 发送到Web服务器的请求使用的HTTP动词不是 配置为处理请求的模块允许

    (或)

    请求已发送到包含无效HTTP谓词的服务器

    (或)

    请求是针对静态内容的,并且包含HTTP动词其他 比GET或HEAD

    (或)

    使用HTTP谓词POST将请求发送到虚拟目录 默认文档是不支持HTTP的静态文件 GET或HEAD以外的动词。

但是如果使用Route(" Test"),方法just works fine如下所示:

[POST]到http://localhost.com:59985/ServiceRequest/Test - 工作正常。 (Route is [Route("Test")])

[POST]到http://localhost.com:59985/ServiceRequest -------不起作用(Route is [Route("")]

POST不允许为空Route吗? 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

原来是个问题,因为[RoutePrefix("ServiceRequest")]与控制器名称的名称相同。

当我更改[RoutePrefix()]之前一切正常。

答案 1 :(得分:1)

[RoutePrefix]为您的路线添加前缀。因此,在您的示例中,如果您没有指定[RoutePrefix]属性,那么按照惯例,您的路线将是:

.../api/ServiceRequest

通过添加[RoutePrefix]属性,您说该控制器中的路由将以指定路线为前缀,即您实际上将路线更改为:

.../api/ServiceRequest/ServiceRequest

这可能是您出问题的原因吗?我不确定是否有一个与控制器名称相同的RoutePrefix一定是问题所在,但我可能错了 - 我还是很擅长这个东西。