【问题标题】:ASP.NET WebAPI returning Http 405ASP.NET WebAPI 返回 Http 405
【发布时间】:2015-11-26 08:57:42
【问题描述】:

我有一个 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”

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

[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 种方法装饰方式相同?
  • 你在~/api/invitations 路径中有物理/虚拟目录吗?否则,您必须出示您的 Web.Config...
  • 从您的方法中移除 [Route] 属性或将其更改为 [Route("")]
  • 调用http://host/api/invitations/create 有效吗?当您使用 [ActionName("Post")] 注释您的操作时会发生什么?
  • @YuvalItzchakov 它在 IIS 上运行,确定我正在发送 POST 请求。

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


【解决方案1】:

在控制器级别将您的控制器 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)

【讨论】:

  • 可以,但是和返回的错误无关
  • @haim770 你试过 [Route("")] 而不是 [Route]?
【解决方案2】:

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

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

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

【讨论】:

  • 这就像一个魅力 =) 在解释时实际上非常明显。谢谢!
  • 这正是发生在我身上的事情。我展平了目录结构并开始工作。谢谢!
猜你喜欢
  • 2018-06-29
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 2013-10-24
  • 2017-04-19
相关资源
最近更新 更多