2014-01-09 173 views
5

このURLを実行すると、/api/users/1は、HttpDelete-Attributeを使用すると、削除アクションにのみマッピングされます。この行動の理由は何ですか?エルス要求されたリソースがHTTPメソッドをサポートしていませんGET

私は彼のメッセージが表示されます:要求されたリソースは、HTTPメソッドをサポートしていません

[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"); 
    } 
} 

は、これらは私のルートですGET:規約により

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のアクションがないという不満があります。あなたがDELETEで要求を行う場合、それはあなたが定義した削除アクションにマップされます明らかに

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で。 "GetContact"や "GetAllContacts"などの "Get ..."で始まるアクションを探します。この規約はGET、POST、PUT、DELETEメソッドにのみ適用されます。後でその例を見てみましょう」

+0

公開されているHttpResponseMessage Get()があるため、「簡潔さのために削除されました」というコメントが表示されるので、これはあなたが話す理由にはなりません。私は完全なコード(Getメソッド)で私の質問を更新しました – Elisabeth

+0

しかし、パラメータを受け入れるGETアクションがありません。あなたのURL/api/users/1に基づいて、引数として1を渡そうとしていますが、それを受け入れるGETアクションはありません。ルーティングは 'public HttpResponseMessage Get(int id)'のようなアクションを探しています –

+0

私はapi/users/1でフィドラーを使用し、http動詞をDELETEに設定すると動作します。しかし、ブラウザのURLでapi/users/1をトリガーすると、Get(int id)がトリガーされます(あなたが言ったように)。これは、ブラウザで発生するすべてのURLがデフォルトでGETリクエストであることを意味しますか? – Elisabeth

関連する問題