6

ルーティングを使用してasp.net Web APIプロジェクトをセットアップしました(Mvcプロジェクトとまったく同じように機能します)-したがって、次のようになります

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

したがって、すべてが思い通りに機能します.... api/Products/15 と入力すると、製品コントローラーに到着し、ID として 15 が渡されます。

偉大な。

さらに 2 つのコントローラーがあり、1 つは UploadsController と呼ばれ、もう 1 つは DownloadsController と呼ばれます。これらはアップロードとダウンロードを提供します (GET / PUT など)

今、私はそれらが元のルールによって取り上げられることを望んでいません(上記を参照)

しかし、私が望むのは、これらの2つのURLを使用してアクセスすることです

/api/トランスポート/アップロード/15 /api/トランスポート/ダウンロード/15

ID として 15 を渡しましたが、おそらく実際には発生しないでしょう...デモンストレーションに適しています :-)

現在、トランスポートは存在しないため、次のことができます

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/Transports/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

私はそれがうまくいくと信じています...

しかし、問題は、もし私がそうするなら

/api/Uploads/15 - これは、私が望まない元のルールによってもキャッチされます..

トランスポートなしではなく、偽の「トランスポート」を介してアップロードおよびダウンロードコントローラーにアクセスしたい

誰でも助けることができますか?

前もって感謝します

4

1 に答える 1

18

ルート制約を使用して、次の順序で 2 つの API ルートを定義できます。

// matches /api/transports/downloads/id or /api/transports/uploads/id only
// and no other possible controller
routes.MapHttpRoute(
    name: "API Transport",
    routeTemplate: "api/transports/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional },
    constraints: new { controller = "uploads|downloads" }
);

// matches anything in the form /api/{controller}/id where {controller}
// could be anythnig different than "downloads" or "uploads" because we don't
// want to allow the following urls: /api/downloads/id and /api/uploads/id
routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional },
    constraints: new { controller = @"^((?!(downloads|uploads)).)*$" }
);
于 2012-06-20T14:39:04.510 に答える