web-dev-qa-db-ja.com

要求されたリソースはHTTPメソッドGETをサポートしていません

このURLを実行すると:/api/users/1 HttpDelete-Attributeを使用した場合、削除アクションにのみマップされます。この動作の理由は何ですか?

そうでなければ私は彼のメッセージを受け取ります:要求されたリソースは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 }
            );
5
Elisabeth

慣例により、HTTP動詞は、そのHTTP動詞のプレフィックスが付いたアクション名と一致します。

そのため、ブラウザで簡単なリクエストを行うときに使用される動詞であるHTTPGETのアクションがないという不満があります。次のような名前のアクションが必要です。

public HttpResponseMessage Get(int id)

あるいは

public HttpResponseMessage GetUser(int id)

明らかに、DELETEを使用してリクエストを行うと、定義した削除アクションにマップされます。

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

「アクションを見つけるために、Web APIはHTTPメソッドを調べてから、そのHTTPメソッド名で始まる名前のアクションを探します。たとえば、GETリクエストの場合、WebAPIは「Get ..」で始まるアクションを探します。 「GetContact」や「GetAllContacts」など。この規則は、GET、POST、PUT、およびDELETEメソッドにのみ適用されます。コントローラーの属性を使用して他のHTTPメソッドを有効にできます。その例については後で説明します。 。」

17
Mister Epic