4

我有一个 WebApi 控制器

[RoutePrefix("api/invitations")]
public class InvitationsApiController : ApiController

和一个动作方法:

[Route]
[HttpPost]
public IHttpActionResult Create([FromBody] CreateCommand command)

当我尝试 POST 到http://host/api/invitations时,我得到一个““405 Method Not Allowed”</p>

但是当我使用另一条路线时:

[Route("test")]
[HttpPost]
public IHttpActionResult Create([FromBody] CreateCommand command)

WebApiConfig.cs

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services
    SetupFormatters(config);

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi", 
        routeTemplate: "api/{controller}/{id}", 
        defaults: new { id = RouteParameter.Optional });
}

并发布到http://host/api/invitations/test的工作。我的控制器在请求“root”时工作得非常完美。

有关 Http 错误的更多详细信息:

HTTP 错误 405.0 - 方法不允许 由于正在使用无效的方法(HTTP 动词),因此无法显示您要查找的页面。

Detailed Error Information: 
Module    DefaultDocumentModule
Notification    ExecuteRequestHandler  
Handler    StaticFile  Error
Code    0x80070001  
Requested URL   http://localhost:8008/api/invitations  
Physical Path <removed>   
Logon Method  Anonymous  
Logon User    Anonymous

有什么建议可能是错的吗?

4

2 回答 2

2

问题是您的物理目录与您的路线 ( /api/invitations) 匹配。因为这样的物理目录存在,IIS 本机DirectoryListingModuleDefaultDocumentModule模块(不允许动词)在(由 MVC 和 WebAPI 使用)能够处理它POST之前接管请求。TransferRequestHandler

没有理由将您InvitationsController.cs的目录结构放在与请求的路由匹配的目录结构中。这就是为什么我们首先要有路由,以便能够动态注册路由,而不管控制器的物理位置如何。

通用约定(这也是默认的 WebAPI 模板结构)是将控制器放在~/Controllers目录(或~/Controllers/Api)中。但您实际上可以将它们放在任何目录中,只要它们被编译为项目的一部分。

于 2015-09-02T07:04:12.103 回答
2

RoutePrefix将控制器声明更改Route为控制器级别:

[Route("api/invitations")]
public class InvitationsApiController : ApiController

RoutePrefix不会将路由添加到路由表。这意味着,如果您想使用RoutePrefix,则必须为每个操作本身添加前缀,例如:

[RoutePrefix("api/invitations")]
public class InvitationsApiController : ApiController

[Route("")]
[HttpPost]
public IHttpActionResult Create([FromBody] CreateCommand command)
于 2015-09-01T08:02:54.563 回答