1

サード パーティ サーバーからの要求を受け入れるように ASP.NET MVC 4 Web API をセットアップしていますが、ルート マッピングの設定方法がわかりません。サードパーティのサーバーが次の応答を受け取ることを期待しているとします。

  1. http://[my_server]/authorize?user=[user name]&session=[session token]&item=[item]
  2. http://[my_server]/release?user=[user name]&session=[session token]

または、リクエストは専用パスを使用できます。つまり、次のようになります。

  1. http://[my_server]/***api***/authorize?user=[user name]&session=[session token]&item=[item]
  2. http://[my_server]/***api***/release?user=[user name]&session=[session token]

両方の選択肢をサポートできるようにしたいと思います。

より伝統的な形式に従う追加のリクエスト/controller/idも実装する必要がありますが、上記に焦点を当てたいと思います (Web API がここに行く方法であるかどうかさえわかりません)。

次のコントローラーを作成しました。

public class MyController : ApiController
{
    [HttpGet]
    [ActionName("authorize")]
    public string Authorize(string user, string session, string item)
    {
        ...
        // return "OK" or "DENY";
    }

    [HttpGet]
    [ActionName("release")]
    public string Release(string user, string session)
    {
        ...
        return "OK";
    }
}

SO および の他の場所で見つけることができるすべてをWebAppConfig.Register試しましたが、ブラウザでリクエストを試行すると 404 エラーが発生し続けます。

http://localhost:22332/api/authorize?user=ury&session=token&item=an_item

WebAppConfig.Register私の質問は、上記のリクエストを処理するために、具体的にはコントローラー内とコントローラー内で何をしなければならないかということです(私のテスト URL が正しいと仮定して...)。

4

2 に答える 2

2

URL 内のコントローラー名をコントローラー クラスに一致させるための Web API 規則につまずいています。

コントローラーの名前が「MyController」の場合、リクエストする URL は次のとおりです。

http://localhost:22332/api/my/authorize?user=ury&session=token&item=an_item

URL に「api」ビットがない要求をサポートするには、WebApiConfig.cs の Register メソッドに 2 つ目のルート定義を追加するだけです。URL で「アクション」も使用しているため、次の 2 つのルートが必要になります。

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

    config.Routes.MapHttpRoute(
        name: "RootWebApiRoute",
        routeTemplate: "{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

「api」プレフィックスとコントローラーパラメーターを省略したい場合は、別のルート定義が必要だと思います。何かのようなもの:

    public static void Register(HttpConfiguration config) {
        config.Routes.MapHttpRoute(
            name: "ActionOnlyRoute",
            routeTemplate: "{action}",
            defaults: new { controller = "My" }
        );
    }

ここでは、URL 内の「アクション」のみを探し、すべてを「MyController」クラスにルーティングします。

于 2012-11-19T19:06:51.690 に答える
1

Route Debuggerの多くの助けを借りて、これに数時間取り組んだ後、Phil Haack に感謝します! - 問題と解決策の両方を見つけました。

問題: アプリのルート マッピングが初期化されるルート マッピング マッチングは順序付けられRouteTable.Routesにかなりの数が含まれています。私が探していたリクエスト パターンも、これらのマッピングの一部と一致していました (たとえば、「承認」はコントローラーとして一致していました)。

解決策:デフォルトのマッピングの前に「my」ルート マッピングを追加します。

そうだね...

ではほとんどの操作がサポートされていないためHttpRouteCollection、結果のコードは少し見苦しくなりますが、機能します。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        routesCopy = new RouteBase[RouteTable.Routes.Count];

        RouteTable.Routes.CopyTo(routesCopy, 0);

        config.Routes.Clear();
        config.Routes.MapHttpRoute(name: "AuthorizeWebApiRoute", routeTemplate: "authorize", defaults: new { controller = "My", action = "authorize" });
        config.Routes.MapHttpRoute(name: "ReleaseWebApiRoute", routeTemplate: "release", defaults: new { controller = "My", action = "release" });

        foreach (var route in routesCopy)
        {
            RouteTable.Routes.Add(route);
        }
    }
}

「私の」ルートマッピングがデフォルトのマッピングと一致しない限り (一致しないように十分に具体的にしました)、私はすべて問題ありません - 私は思う...

于 2012-11-24T21:04:01.010 に答える