2014-01-09 295 views
5

当我运行此URL:/api/users/1它只在使用HttpDelete-Attribute时映射到Delete操作。这种行为的原因是什么?请求的资源不支持HTTP方法GET

否则我收到他的消息:所请求的资源不支持HTTP GET方法

[RoutePrefix("api/users")] 
public class UserController : ApiController 
{ 
    private readonly IUserService _userService; 
    public UserController(IUserService userService) 
    { 
     _userService = userService; 
    } 

    [Route("")] 
    public HttpResponseMessage Get() 
    { 
     return Request.CreateResponse<IEnumerable<UserDTO>>(HttpStatusCode.OK, _userService.GetUsers()); 
    } 

    [Route("{id:int}")] 
    [HttpDelete] 
    public HttpResponseMessage Delete(int id) 
    { 
     _userService.Delete(id); 
     return Request.CreateResponse(HttpStatusCode.OK, "User was deleted successfully"); 
    } 
} 

这是我的路线:

config.MapHttpAttributeRoutes(); 

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

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

回答

16

按照惯例,HTTP动词将匹配到一个动作名称以该HTTP动词作为前缀。

所以,它是在抱怨你没有针对HTTP GET的动作,这是当你用浏览器发出简单请求时使用的动词。你需要一个命名的动作是这样的:

public HttpResponseMessage Get(int id) 

甚至

public HttpResponseMessage GetUser(int id) 

显然,如果你与删除请求,它将映射到你所定义的删除操作。

编号:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

“要查找的动作,网络API着眼于HTTP方法,然后寻找一个动作名称以该HTTP方法名。例如,用GET请求,网页API。查找以“Get ...”开头的操作,例如“GetContact”或“GetAllContacts”。该约定仅适用于GET,POST,PUT和DELETE方法。您可以通过使用属性来启用其他HTTP方法我们稍后会看到一个例子。“

+0

你看到“为简洁起见”评论有我的公共HttpResponseMessage Get()所以这不能成为你说的原因。我用完整的代码更新了我的问题(获取方法) – Elisabeth

+0

但您错过了接受参数的GET操作。根据你的URL/api/users/1,你希望传入1作为参数,但是你没有一个接受GET的动作。路由正在寻找像'public HttpResponseMessage Get(int id)' –

+0

这样的动作当我使用带/ api/users/1的fiddler并将http动词设置为DELETE时,它就起作用。但是当我触发浏览器url中的api/users/1时,它想要触发Get(int id)(如你所说)。这是否意味着默认情况下浏览器中的每个网址触发都是GET请求? – Elisabeth

相关问题