この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 }
);
慣例により、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メソッドを有効にできます。その例については後で説明します。 。」