Apicontrollerでの属性ルーティングの奇妙な行動
-
22-12-2019 - |
質問
属性ルーティングを使用して、System.Web.HTTP.Apicontrollerから継承するコントローラ内のマイルートを指定しています。私はいくつかのファンキーな行動を得ています。これがいくつかのサンプルコードです:
[RoutePrefix("api/1/user")]
public class UserRestController : ApiController
{
UserService userService = new UserService();
[Route("{id}"), HttpGet]
public UserDTO Get(string id)
{
var user = userService.GetUserById(id);
return user;
}
}
.
それは絶対に私がどのように期待しているのか。 〜/ API / 1 / user / someidを訪問すると、予想される情報が返されます。 Route Prefixで '1'をインクルードしないように切り替えると、「要求URI」のBaseURL / API / user / someId 'と一致するHTTPリソースが見つかりませんでした。 "
MVCルート、Web APIルート、および属性ルートがすべてこのプロジェクトでアプリの起動に登録されていますが、このコントローラのデフォルトルートは〜/ UserRest / ...だから登録しないと思います。それらはこれの原因になりますが、私は間違っているかもしれません。
私が欲しいもののサンプル:
[RoutePrefix("api/user")]
public class UserRestController : ApiController
{
UserService userService = new UserService();
[Route("{id}"), HttpGet]
public UserDTO Get(string id)
{
var user = userService.GetUserById(id);
return user;
}
}
.
〜/ api / user / someIdが機能するだろうが、上記のエラーが発生することが予想される( "要求URI 'baseurl / api / user / someId' '。"と一致するHTTPリソースは見つかりませんでした。 / P>
フルエラーXML:
<Error>
<Message>
No HTTP resource was found that matches the request URI
'baseUrl/api/user/someId';.
</Message>
<MessageDetail>
No type was found that matches the controller named 'user'.
</MessageDetail>
</Error>
. 解決
あなたのエラーの説明に基づいて、MaphtTpattributeroutesを呼び出す前に従来のルートを登録しているようです。たとえば、config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"...)
のようなルートがあるかもしれません。この場合、api/user/someid
のような要求はこのルートと一致し、Web APIはUserController
型のコントローラを探しています。この従来のルートの前に必ずMapHttpAttributeRoutes
を呼び出してください。
基本ルール:より具体的なルートは、より低いまたは一般的なルートの前に登録されるべきです。