5

Web APIは、標準的なユースケースにのみ適しているようです。しかし、もっと複雑なルーティングをしたいのですが、複雑なルーティングのドキュメントが見つかりません。より多くのコントローラーがある場合、ルーティングはますます複雑になります。

依存関係のあるいくつかのオプションのパラメーターを定義できますか?このような:

/api/document/{par1}/{par2}

par1とpar2はオプションである必要がありますが、par2はpar1が存在する場合にのみ一致する必要があります。

そして、再帰的なパラメータは可能ですか?

/api/documents/characteristics/{round/green/red-dots}
/api/documents/characteristics/{square/yellow}
/api/documents/characteristics/{square/yellow/flat}
/api/documents/characteristics/{square/yellow/flat/...}

Web APIルーティングの詳細なドキュメントはありますか?マイクロソフトのチュートリアルは基本的すぎます...ルーティングに関する詳細情報が必要です。

2つのコントローラーがあり、2つのルーティングが非常に似ているために問題が発生し、間違ったルートが使用されます。[アクション]-属性を回避策として使用できますが、これは正しくないと感じます...ルートの順序も考慮する必要があります。これは論理的ですが、どこにも言及されていません。WebAPIは単純なRESTAPI専用ですか?


編集: 私はこれを試しました:

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

//routes.MapHttpRoute(
//    name: "DefaultApiWithAction",
//    routeTemplate: "api/{mandant}/documents/{id}/{action}",
//    defaults: new { controller = "documents" }
//    );

私には2つの方法があります:

[AcceptVerbs("get")]
public HttpResponseMessage Get(int id)

[ActionName("file")]
[AcceptVerbs("get")]
public HttpResponseMessage filedownload(int id)

問題が発生しました。2番目のルートをコメントアウトしてもファイルアクションがトリガーされ、複数のアクションが原因で通常の特定のドキュメントの取得メソッドがトリガーされません... [NoAction]属性を試しましたが、機能しません。 。しかし、route-templateにアクションがない場合、なぜfile-methodがトリガーされるのでしょうか。(または、2番目のルートがアクティブな場合、URLにアクションがない場合、通常のget-documentメソッドがトリガーされないのはなぜですか...)現在の回避策は、他のすべてのメソッドにdefault-actionを設定することですが、これは良い解決策ではありません。

4

1 に答える 1

8

ルーティング制約を使用して、次のように global.asax でルーティングの条件を設定できます。

routes.MapRoute(
    "ApiRoute",
    "api/document/{par1}/{par2}",
    new {controller="Document", action="SomeMethod"},
    new {par1 = @"\d+" }
 );

最後のパラメーターでは、使用するルートの指定されたパラメーターに一致する必要がある正規表現を指定できます。上記の例par1では、数字のみに使用されていますが、次のような任意の正規表現を使用できます。

routes.MapRoute(
    "ApiRoute",
    "api/document/{par1}/{par2}",
    new {controller="Document", action="SomeMethod"},
    new {par1 = @"(value1|value2|value3)" }
 );
于 2012-06-12T08:37:39.327 に答える