2

と の 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 メソッドに追加しようとしましたが、成功しませんでした。

ここで何が起こっているのか、何か考えがある人はいますか? アクションセレクターが正しいアクションを見つけられない理由を、私の人生では理解できません。

4

1 に答える 1

7

GranteesController のアクションのパラメーター名を「granteeId」から「id」に変更する必要があります。

public GranteeModel Get(int id )

于 2012-08-27T17:04:48.100 に答える