と の 2 つのモデルを持つ Web プロジェクトがIndicatorModel
ありGranteeModel
ます。IndicatorsController
また、各 - 、およびに対応する ApiControllers もありGranteesController
ます。このセットアップを実際の Web プロジェクトと並行してデータ API に使用することを計画しているので、単に「Api」という名前の新しいエリアをプロジェクトに作成しました。私のApiAreaRegistration
クラスでは、これらのコントローラーのルートを次のように登録しています。
context.Routes.MapHttpRoute(
name: "ApiDefault",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
基本的に、 へのリクエストhttp://myapp/api/indicators/123
は Indicators コントローラーに送信する必要があり、具体的には整数パラメーターを受け入れるアクション メソッドによって処理する必要があります。私のコントローラークラスは次のように設定されており、完全に機能します。
public class IndicatorsController : ApiController
{
// get: /api/indicators/{id}
public IndicatorModel Get(int id)
{
Indicator indicator = ...// find indicator by id
if (indicator == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return new IndicatorModel(indicator);
}
}
私GranteesController
のクラスは同じように設定されています:
public class GranteesController : ApiController
{
// get: /api/grantees/{id}
public GranteeModel Get(int granteeId)
{
Grantee grantee = ... // find grantee by Id
if (grantee == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return new GranteeModel(grantee);
}
}
ここで問題です。 にリクエストを送信しようとするとhttp://myapp/api/grantees/123
、404 が返されます。404 がGet メソッドからのものではないことが 100% 確実です。1 つには、そのメソッド内でデバッグとログ記録を試みましたが、メソッドが実際にヒットすることはありません。また、リクエストへの実際の出力 (json) は次のようになります。
{
"Message": "No HTTP resource was found that matches the request URI 'http://myapp/api/grantees/25'.",
"MessageDetail": "No action was found on the controller 'Grantees' that matches the request."
}
また、TraceWriter ログへの出力は次のようになります。
;;http://myapp/api/grantees/10
DefaultHttpControllerSelector;SelectController;Route='controller:grantees,id:10'
DefaultHttpControllerSelector;SelectController;Grantees
HttpControllerDescriptor;CreateController;
DefaultHttpControllerActivator;Create;
DefaultHttpControllerActivator;Create;MyApp.Areas.Api.Controllers.GranteesController
HttpControllerDescriptor;CreateController;MyApp.Areas.Api.Controllers.GranteesController
GranteesController;ExecuteAsync;
ApiControllerActionSelector;SelectAction;
DefaultContentNegotiator;Negotiate;Type='HttpError', formatters=[JsonMediaTypeFormatterTracer...
したがって、私のリクエストは正しくルーティングされています。正しいコントローラーが選択され、Id プロパティが正しく設定されています (10)。ただし、ApiControllerActionSelector
一致するコントローラーのメソッドが見つかりません。[HttpGet]
また、属性を Get メソッドに追加しようとしましたが、成功しませんでした。
ここで何が起こっているのか、何か考えがある人はいますか? アクションセレクターが正しいアクションを見つけられない理由を、私の人生では理解できません。