我有一个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
有什么建议可能是错的吗?
答案 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/invitations
和DirectoryListingModule
模块(不允许DefaultDocumentModule
动词)将在POST
之前接管请求(由TransferRequestHandler
使用MVC和WebAPI)能够处理它。
没有理由将InvitationsController.cs
置于与所请求路由匹配的相同目录结构中。这就是我们首先进行路由的原因,无论控制器的物理位置如何,都能够动态注册路由。
通用约定(也是默认的WebAPI模板结构)是将控制器放在~/Controllers
目录(或~/Controllers/Api
)中。但实际上,只要它们被编译为项目的一部分,您就可以将它们放在任何目录中。