5

ASP.NET Web API 2.1 を使い始めたところ、制限が発生しました。属性ルーティングを使用すると、次のことができます。

[Route("item/{id:int}")]
public IHttpActionResult GetItem(int id)
{
    ...
}

URL/item/5はこのアクションにルーティングされますが、 の制約により、URL はルーティングされ/item/abcません。int{id:int}

idクエリ パラメーターに対するルート制約の使用がドキュメントで言及または実証されていないにもかかわらず、パラメーターがその制約と共にクエリ文字列に含まれるように URL を変更しようとしました。

[Route("item?{id:int}")]
public IHttpActionResult GetItem(int id)
{
    ...
}

今実行しようとすると、 のConfigureメソッド呼び出しでエラーが発生しApplication_Startます。

protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

メッセージは次のとおりです。

ArgumentException はユーザー コードによって処理されませんでした

ルート テンプレートは、'/' または '~' 文字で始めることはできません。また、'?' を含めることもできません。キャラクター。

これについては、2 つのことが気になります。

まず、 MSDNのルート プレフィックスについて説明しているセクション~では、ルート テンプレートの先頭に文字を配置しても問題ないことを明確にしています。試してみましたが、ドキュメントどおりに動作します。

次に、これが気に入らない場合、クエリ パラメータにルート制約を設定するにはどうすればよいですか? ルート制約を削除して、次のことを検討してください。

[Route("item")]
public IHttpActionResult GetItem(int id)
{
    ...
}

URLは-に設定さ/item/5れたこのアクションにルーティングされますが、に設定された URL もルーティングされます。id5/item/abcid0

クエリ パラメーターにルート制約を設定する方法はありませんか?

4

1 に答える 1

10

http://attributerouting.net/#asp-net-web-api (†)によると、これは不可能です。

"注意してください! Web API WebHost フレームワークとの統合の問題により、次の機能は動作しません: …</p>

  • クエリ文字列パラメーターの制約、…"

†)この回答は、別のAttributeRouting.WebApiNuGet パッケージを使用して属性ルーティングが行われた以前のバージョンの Web API に対して書かれたものであることに注意してください。その後、属性ルーティングはWeb API コアに組み込まれました。それにもかかわらず、クエリ文字列パラメーターの制約はそのままではまだサポートされていないようです。

于 2014-02-05T21:46:51.490 に答える