1

global.asax.csファイルに次のようなルートを設定しています。

routes.MapHttpRoute(
            name: "ColorsRoute",
            routeTemplate: "api/{controller}/{action}/{styleId}",
            defaults: new
            {
                controller = "Cars",
                action = "Colors"
            }
        );

コントローラー:

    public Dictionary<string, string> Colors(string styleid)
    {
        //returns a dictionary of colors and ids
    }

問題は、次のようなURLを使用する場合です。

localhost:58645/api/cars/colors/18752867

styleIdを取得しませんが、従来は次のように使用して機能します。

localhost:58645/api/cars/colors?styleid=18752867

なぜこれが起こっているのかについてのアイデアはありますか?

アップデート:

これらのルートは、「domain.com/api/cars/makes/new」のような呼び出しで正常に機能しています。

        routes.MapHttpRoute(
            name: "MakesRoute",
            routeTemplate: "api/{controller}/{action}/{state}",
            defaults: new
            {
                controller = "Cars",
                action = "Makes"
            }
        );

コントローラ:

    public Dictionary<string, string> Makes(string state)       
    {
        //return dictionary of makes and ids
    }

これが私が持っている追加のルートです:

        routes.MapHttpRoute(
            name: "ModelsRoute",
            routeTemplate: "api/{controller}/{action}/{make}/{state}",
            defaults: new
            {
                controller = "Cars",
                action = "Models"
            }
        );

        routes.MapHttpRoute(
            name: "YearsRoute",
            routeTemplate: "api/{controller}/{action}/{modelId}/{state}",
            defaults: new {
                controller = "Cars",
                action = "Years"
            }
        );

        routes.MapHttpRoute(
            name: "StylesRoute",
            routeTemplate: "api/{controller}/{action}/{make}/{model}/{year}",
            defaults: new {
                controller = "Cars",
                action = "Styles"
            }
        );
4

1 に答える 1

4

ルートを定義した順序によっては、一致したルートがリクエストの送信先ではない場合があります。特に YearsRoute と ModelsRoute では。同じ数のセグメントがありますが、ルーティング制約が指定されていません。

MapHttpRoute を最初の登録ルートとして試し、正規表現の制約を追加してみてください

routes.MapHttpRoute(
        name: "ColorsRoute",
        routeTemplate: "api/{controller}/{action}/{styleId}",
        defaults: new
        {
            controller = "Cars",
            action = "Colors"
        },
      constraints: new { styleId = @"\d+" }
    );

これで一致するかどうかを確認します。

UPDATE
別のオプションは、使用したい ApiController および Action メソッドに直接マップする URI 用に特別にルートを定義することです。そうすれば、リクエストは常にあなたが望むアクションに行きます

于 2012-04-17T02:04:21.647 に答える