ルート属性にワイルドカードを適用して、たとえば日付入力などの_/
_を許可できることを知っています。
_[Route("orders/{*orderdate}")]
_
ワイルドカードの問題は、URIの最後のパラメーターにのみ適用されます。次のURIが必要な場合、どうすれば問題を解決できますか。
_[Route("orders/{orderdate}/customers")]
_
更新:
コードをリファクタリングすることで問題を解決するオプションはほとんどないので、次のようなソリューションを提供しないでください。
[Route("orders/customers/{orderdate}")]
に変更します"dd-mm-yyyy"
_)@ bet ..genericUriParserOptions
は.net 4.5以降には適用できなくなったと思います。
@ JotaBeで示唆されているように、urlリクエストを正しくデコードする必要があるかもしれません。ほとんどの場合、%2F
は自動的にスラッシュ'/'
に変換されます。したがって、エスケープする必要がある場合は、最初に'%'
charをデコードする必要があります。したがって、URL:はwww.domain.com/api/orders/23%252F06%252F2015/customers
のようになります。
文字'%252F'
が実際の'%2F'
に変換されることに注意してください
[〜#〜] edit [〜#〜]
OKは完全なソリューションです(試してみて、私のために働いています):
次のようなAPIエンドポイントがあると仮定します。
[Route("orders/{date}/customers")]
public HttpResponseMessage Get(string date)
{
}
web.configでは、requestPathInvalidCharacters
を空に設定して、asp.netにすべての要求を許可するように指示する必要があります。
<system.web>
<httpRuntime targetFramework="4.5" requestPathInvalidCharacters=""/>
</system.web>
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>
クライアントがAPIにリクエストを送信する場合、次のように'%'
をエスケープする必要があります。
www.domain.com/api/orders/23%252F06%252F2015/customers
次に、リクエストをデコードする必要があります
[Route("orders/{date}/customers")]
public HttpResponseMessage Get(string date)
{
DateTime actualDate = DateTime.Parse(System.Net.WebUtility.UrlDecode(date)); // date is 23/06/2015
}
@AlexeiLevenkovによるコメントで述べたように、これは間違っています。
これは各URLフラグメントを区切る特別なシンボルであるため、スラッシュを受け入れるパラメーターをURLに含めることはできません。したがって、URLにこのシンボルを含めると、新しいフラグメントが作成され、1つのパラメーターに複数のフラグメントを含めることはできません。
より詳細な情報が必要な場合は、 これをお読みください ですが、これらは最も関連性の高い抜粋です。
?
_または_#
_で終わります。そのため、スラッシュは、URLパスのオカレンスまたはそれらのシンボルの1つ前のセクションにのみフラグメントを作成します。そのため、クエリ文字列には、必要に応じてスラッシュ(_/
_)を含めることができ、パスセグメントをまったく定義しません。
これらは、質問に対するいくつかの解決策です。
[Route("orders/{month}/{day}/{year}/customers")]
のように、日、月、年のフラグメントを含めてから、サーバー側で日付を作成します注:元の質問は「クエリ文字列」であり、エンコードに関する私のコメントはクエリ文字列を参照しました。クエリ文字列は、疑問符が存在する場合は、_like &id=27
_。 「クエリ文字列」に言及しないように質問を修正しましたが、これは必要なものの正しい名前ではありませんでした
次のURI [Route("orders/{DD:int}/{MM:int}/{YY:int}}/customers")]
を使用し、カスタムモデルバインダーを使用してDD/MM/YY
そして、アクションメソッドでバインドできる日付に変換します。
制約の処理方法(正規表現を厳しくする)を選択するか、検証を使用して、一致しない場合は400を返します。
より簡単なアプローチは、Day/Month/Year
とコードにまとめます。
modelbindingでの対処 のリンクを次に示します。
C#には、エスケープシーケンスのルールをスキップする独自のメソッドがあり、メソッドの名前はri.UnescapeDataString(クエリ文字列パラメーター)パラメータ値を取得しながら使用できます