0

ストレートMVCでルートを使用したことがありますが、ASP.NETWebAPIはあまり使用していません。明らかに私は何か間違ったことをしています、おそらく誰かが助けることができますか?UsersControllerという1つのコントローラーと、RegisterとDetailsという2つのメソッドがあり、どちらも2つの文字列パラメーターを受け取り、HttpGetとしてマークされた文字列を返します。もともと私はWebApiConfig.csの2つのルートマッピングから始めました。

config.Routes.MapHttpRoute(
      name: "TestApi",
      routeTemplate: "api/{controller}/{action}/{userId}/{key}"
  );
  config.Routes.MapHttpRoute(
      name: "Test2Api",
      routeTemplate: "api/{controller}/{action}/{userId}/{class}"
  );

この設定では、次のようなURLの最初のルートのみが検出されます。

http://<domain>/api/users/register/a123/b456/

私が電話した場合:

http://<domain>/api/users/details/a123/b456/

404を取得します。2つのルートを入れ替えると、Detailsメソッドを呼び出すことはできますが、Registerメソッドを呼び出すことはできず、再び404を取得します。現在の回避策は、ルートをより具体的にすることです。

config.Routes.MapHttpRoute(
      name: "TestApi",
      routeTemplate: "api/{controller}/register/{userId}/{key}"
  );
  config.Routes.MapHttpRoute(
      name: "Test2Api",
      routeTemplate: "api/{controller}/details/{userId}/{class}/"
  );

UsersControllerは次のようになります。

namespace HelloWebAPI.Controllers
{
  using System;
  using System.Web.Http;
  using HelloWebAPI.Models;

    public class UsersController : ApiController
    {
      [HttpGet]
      public string Register(string userId, string key)
      {
        return userId + "-" + key;
      }

      [HttpGet]
      public string Enrolments(string userId, string @class)
      {
        return userId + "-" + @class
      }
    }
}

したがって、私が理解していないのは、2番目に登録されたルートの{action}コンポーネントが正しいメソッドに関連付けられていない理由です。

ありがとう

ジョー

4

2 に答える 2

2

ASP.NET Web API のルーティングは、次の 3 つの手順で機能します。

  1. URI をルート テンプレートに一致させます。
  2. コントローラーの選択。
  3. アクションの選択。

フレームワークは、URI に一致するルート テーブル内の最初のルートを選択します。2 番目または 3 番目のステップが失敗した場合の「2 番目の推測」はありません - 404 だけです。あなたの場合、両方の URI は常に最初のルートと一致するため、2 番目のルートは決して使用済み。

さらに分析するために、最初のルートが次のとおりであると仮定します。

api/{controller}/{action}/{userId}/{key}

そして、次の URI で呼び出します。

http://<domain>/api/users/enrolments/a123/b456/

アクション フレームワークを選択するために、次の 3 つのことを確認します。

  • リクエストの HTTP メソッド。
  • {action}ルート テンプレートのプレースホルダー (存在する場合)。
  • コントローラーのアクションのパラメーター。

この場合、{action}パーツは に正しく解決されますが、フレームワークはおよびパラメータを持つメソッドをenrolments探します。メソッドに一致しないパラメーターがあります。これにより、404が発生します。EnrolmentsuserIdkeyclass

この問題を回避するには、より具体的なルートを作成するか (以前のように)、パラメーター名を統一する必要があります。

于 2013-03-22T09:25:02.513 に答える
1

1 つのルートを定義するだけで済みます。

config.Routes.MapHttpRoute(
    name: "TestApi",
    routeTemplate: "api/{controller}/{action}/{userId}/{key}"
);

次に、コントローラーのメソッドを次のように変更します。

[HttpGet]
public string Register(string userId, string key)
{
  return userId + "-" + key;
}

[HttpGet]
public string Details(string userId, string key)
{
  return userId + "-" + key
}
于 2013-03-22T09:21:23.370 に答える