3

同じ署名を持つ複数のget/post呼び出しを持つWebAPIを構築しています。これで、複数の同一の呼び出しの場合、通常2つのオプションがあります。異なるコントローラーに分割するか、ルートで{action}を使用します。ほとんどのコントローラーを信じるのに最も適しているので、{action}メソッドを使用しました。ただし、私のコントローラーの1つでは、アクションメソッドを使用したくありません。

私はそのような電話をしています:

[HttpGet]
public Program Program(string venue, string eventId)
//api/{controller}/{venue}/{eventId}

今、私は新しい電話が必要です

[HttpGet]
public Program ProgramStartTime(string venue, string eventId)
//api/{controller}/{venue}/{eventId}

これにアクション名を追加して、ieを呼び出すことができることを知っています

api/{controller}/{action}/{venue}/{eventId}

しかし、私はそれが期待を破るような気がします。私が何かのようなことができる方法はありますか

api/Content/LAA/1/PST
api/Content/LAA/1?PST

また、アクションルートを使用する必要がある場合は、現在、他のコントローラーに使用するルートがすでにありますが、パラメーターとして{id}を使用するだけです。新しいルートはこれと競合しますか?ルートを設定するためのより良い方法はありますか?

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

config.Routes.MapHttpRoute(
   name: "...",
   routeTemplate: "api/{controller}/{action}/{venue}/{eventId}/{...}/{***}/{###}",
   defaults: new {### = RouteParameter.Optional}
);

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

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

最大5つのパラメーターを持つ少なくとも1つのメソッドを期待しています

4

1 に答える 1

3

これが私が見つけた答えです、そしてそれは私が望んでいたことをほぼ正確に行います:

        config.Routes.MapHttpRoute(
            name: "VenuesAllOrStream",
            routeTemplate: "api/Racing/{action}",
            defaults: new { controller = "Racing", action = "Venues" },
            constraints: new { action = "Venues|All|Streaming" }
        );

        config.Routes.MapHttpRoute(
            name: "VenueOrVideo",
            routeTemplate: "api/Racing/{venue}/{action}",
            defaults: new { controller = "Racing", action = "RaceNumbers" },
            constraints: new { action = "RaceNumbers|Video" }
        );

        config.Routes.MapHttpRoute(
            name: "ProgramOrMtp",
            routeTemplate: "api/Racing/{venue}/{race}/{action}",
            defaults: new { controller = "Racing", action = "Program" },
            constraints: new { action = "Program|Mtp", race = @"\d+" }
        );

VenuesAllOrStreamが最初であることが重要です。そうでない場合、VenueOrVideoがルートを取得します。ほとんどの場合、アクション制約を後で列挙型に抽出します。

簡単な注意:アクションのデフォルトを設定すると、ルートは基本的にオプションのパラメーターになります。したがって、各ルートは{action}が実際に設定されていなくても機能します。

于 2013-03-28T16:16:48.223 に答える