web-dev-qa-db-ja.com

URLにスラッシュ「/」を含むルートパラメーター

ルート属性にワイルドカードを適用して、たとえば日付入力などの_/_を許可できることを知っています。

_[Route("orders/{*orderdate}")]
_

ワイルドカードの問題は、URIの最後のパラメーターにのみ適用されます。次のURIが必要な場合、どうすれば問題を解決できますか。

_[Route("orders/{orderdate}/customers")]
_

更新:

コードをリファクタリングすることで問題を解決するオプションはほとんどないので、次のようなソリューションを提供しないでください。

  1. ルートテンプレートを[Route("orders/customers/{orderdate}")]に変更します
  2. 日付を別の形式に変更します(例:_"dd-mm-yyyy"_)
30
bet

@ bet ..genericUriParserOptionsは.net 4.5以降には適用できなくなったと思います。

@ JotaBeで示唆されているように、urlリクエストを正しくデコードする必要があるかもしれません。ほとんどの場合、%2Fは自動的にスラッシュ'/'に変換されます。したがって、エスケープする必要がある場合は、最初に'%' charをデコードする必要があります。したがって、URL:はwww.domain.com/api/orders/23%252F06%252F2015/customersのようになります。

文字'%252F'が実際の'%2F'に変換されることに注意してください

[〜#〜] edit [〜#〜]

OKは完全なソリューションです(試してみて、私のために働いています):

  1. 次のようなAPIエンドポイントがあると仮定します。

    [Route("orders/{date}/customers")]
    public HttpResponseMessage Get(string date)
    {
    }
    
  2. web.configでは、requestPathInvalidCharactersを空に設定して、asp.netにすべての要求を許可するように指示する必要があります。

    <system.web>
        <httpRuntime targetFramework="4.5" requestPathInvalidCharacters=""/>                
    </system.web>
    <system.webServer>
        <security>
          <requestFiltering allowDoubleEscaping="true" />
        </security>
    </system.webServer>
    
  3. クライアントがAPIにリクエストを送信する場合、次のように'%'をエスケープする必要があります。

    www.domain.com/api/orders/23%252F06%252F2015/customers

  4. 次に、リクエストをデコードする必要があります

    [Route("orders/{date}/customers")]
    public HttpResponseMessage Get(string date)
    {
            DateTime actualDate = DateTime.Parse(System.Net.WebUtility.UrlDecode(date)); // date is 23/06/2015
    }
    
26
ronnie

@AlexeiLevenkovによるコメントで述べたように、これは間違っています。

これは各URLフラグメントを区切る特別なシンボルであるため、スラッシュを受け入れるパラメーターをURLに含めることはできません。したがって、URLにこのシンボルを含めると、新しいフラグメントが作成され、1つのパラメーターに複数のフラグメントを含めることはできません。

より詳細な情報が必要な場合は、 これをお読みください ですが、これらは最も関連性の高い抜粋です。

  • uRLパスは、URLで最初に見つかった_?_または_#_で終わります。そのため、スラッシュは、URLパスのオカレンスまたはそれらのシンボルの1つ前のセクションにのみフラグメントを作成します。
  • セクション3.4から:クエリコンポーネントは最初の疑問符( "?")文字で示され、シャープ記号( "#")文字またはURIの末尾で終了します。

そのため、クエリ文字列には、必要に応じてスラッシュ(_/_)を含めることができ、パスセグメントをまったく定義しません。

これらは、質問に対するいくつかの解決策です。

  • [Route("orders/{month}/{day}/{year}/customers")]のように、日、月、年のフラグメントを含めてから、サーバー側で日付を作成します
  • ユーザーにダッシュやドットなどの別のセパレーターを使用するように要求します。これは問題を引き起こさず、文字列で受け取って自分で解析します(または、独自のカスタムバインダーを使用してその形式をサポートします)
  • RL Rewrite extension を使用して、ルーティングシステムに到達する前にURLを変更し、前のソリューションで説明したように解析します(これにはIISでのホスティングが必要です)
  • クエリ文字列として受信します。例: ´?date = 02/03/2015´(エンコードした方が良いでしょう)

注:元の質問は「クエリ文字列」であり、エンコードに関する私のコメントはクエリ文字列を参照しました。クエリ文字列は、疑問符が存在する場合は、_like &id=27_。 「クエリ文字列」に言及しないように質問を修正しましたが、これは必要なものの正しい名前ではありませんでした

8
JotaBe

次のURI [Route("orders/{DD:int}/{MM:int}/{YY:int}}/customers")]を使用し、カスタムモデルバインダーを使用してDD/MM/YYそして、アクションメソッドでバインドできる日付に変換します。

制約の処理方法(正規表現を厳しくする)を選択するか、検証を使用して、一致しない場合は400を返します。

より簡単なアプローチは、Day/Month/Yearとコードにまとめます。

modelbindingでの対処 のリンクを次に示します。

1
Yishai Galatzer

C#には、エスケープシーケンスのルールをスキップする独自のメソッドがあり、メソッドの名前はri.UnescapeDataString(クエリ文字列パラメーターパラメータ値を取得しながら使用できます

0
asif juneja