ASP.NET WebAPI返回Http 405

时间:2015-09-01 07:48:56

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

我有一个WebApi控制器

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

一种行动方法:

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

当我尝试POST到http://host/api/invitations时,我得到一个“”405方法不允许“

但是当我使用其他路线时:

[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

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

问题是您的物理目录与您的路线匹配({literal} jQuery(document).ready(function() { jQuery("#click-me-web-service").click(function() { jQuery.ajax({ type: "POST", url: "{/literal}{$base_dir}{literal}modules/wrd_web_service/hit-web-service.php", data: { first_name: "Joh", last_name: "Sin", username: "johsin", email: "john12@gmail.com" }, success: function() { console.log("Success."); } }); }) }); {/literal} )。由于存在此类物理目录,因此IIS本机/api/invitationsDirectoryListingModule模块(不允许DefaultDocumentModule动词)将在POST之前接管请求(由TransferRequestHandler使用MVC和WebAPI)能够处理它。

没有理由将InvitationsController.cs置于与所请求路由匹配的相同目录结构中。这就是我们首先进行路由的原因,无论控制器的物理位置如何,都能够动态注册路由。

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