所请求的资源不支持HTTP GET方法。

5

当我运行这个url:/api/users/1时,只有在使用HttpDelete属性时才会映射到Delete操作。为什么会出现这种情况?

否则,我会得到这条消息:所请求的资源不支持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 }
            );
1个回答

17

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

因此,它在抱怨您没有HTTP GET的操作,这是浏览器发出简单请求时使用的动词。 您需要一个名为类似以下内容的操作:

public HttpResponseMessage Get(int id)

甚至

public HttpResponseMessage GetUser(int id)

显然,如果使用 DELETE 发出请求,它将映射到您定义的 Delete 操作。

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

“要查找操作,Web API 查看 HTTP 方法,然后查找以该 HTTP 方法名称开头的操作。例如,对于 GET 请求,Web API 寻找以“Get...”开头的操作,例如“GetContact”或“GetAllContacts”。此约定仅适用于 GET、POST、PUT 和 DELETE 方法。您可以通过在控制器上使用属性来启用其他 HTTP 方法。稍后我们将看到一个例子。”


你看到了“为简洁起见已删除”的注释,那是我的公共HttpResponseMessage Get()方法,所以这不可能是你所说的原因。我已经更新了我的问题,并附上了完整的代码(Get方法)。 - Elisabeth
但是你缺少接受参数的GET操作。根据你的URL /api/users/1,你想要将1作为参数传递,但是你没有一个接受参数的GET操作。路由正在寻找像public HttpResponseMessage Get(int id)这样的操作。 - Mister Epic
当我使用Fiddler与api/users/1并将http动词设置为DELETE时,它可以正常工作。但是,当我在浏览器URL中触发api/users/1时,它想要触发Get(int id)(正如您所说的那样)。这是否意味着浏览器中触发的每个URL默认都是GET请求? - Elisabeth
然后你的陈述:“按照惯例,HTTP动词将匹配以该HTTP动词为前缀的操作名称。”在浏览器URL中触发是有意义的,我需要一个Get(int id)在技术上看到或者在我的情况下,我必须使用HttpDelete属性来标记我的删除 :-) 谢谢! - Elisabeth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接