2010-12-11 9 views
0

GETパラメータ "names []"を使用するサービスを使用する必要があります。例えばクエリー文字列の中でカッコがエンコードされないようにする

:私はC#でWebクライアントを使用することを消費しようとするGET http://example.com/name2id?names []=john

、ブラケットがserviesが理解していない%5B%5D、にエンコードされます。ブラウザを使って上記のコードを送信すると、すべて正常に動作します。

動作しない相続人例:

シオマネキによって監視
using (var client = new System.Net.WebClient()) 
{ 
    response = client.DownloadString(new Uri("http://example.com/name2id?names[]=john")); 
} 

、HERESに要求:

GET http://example.com/name2id?names%5B%5D=john HTTP/1.1 
Host: example.com 
Connection: Keep-Alive 

は、フレームワークは、URLをエンコードしないようにする任意の方法、またはいくつかの他はありますこの問題を回避するには?

P.S.私はAPIを制御しないので、それを変更することはできません。

UPDATE:

これはちょっと奇妙です。

using (var client = new System.Net.WebClient()) 
{ 
    response = client.DownloadString(new Uri("http://example.com/name2id?names[]=john", true)); 
} 

注ウリのboolean dontEscape:私はに私のC#のコードを変更し、解決策を見つけました。実際は廃止されましたが、機能しますか?誰もこれを説明できますか?

+0

私はWebClientを使用しないで、通常のソケットを使用して手動要求を行うことが唯一の方法だと思うが、それでも本当に有効な要求ではないサービスがそれを受け入れるかどうか疑問に思うでしょう。 – Doggett

+0

あなたは、引数に合理的な名前を使用することを常に頼むことができます。もちろん、本当に名前に "[]"が必要であることを確認してください。この要件は私にとってはかなりばかばかしいようです。 –

+0

アップデートを参照してください。 –

答えて

0

CodeInChaosに記載されているように、URLはRFC2396に従って無効です。

C#は無効な文字をエスケープないようにするには、URIのオーバーロードされたメソッドは、USENことができます:

new Uri("http://example.com/name2id?names[]=john", true) 

しかし、この方法は推奨されませんが、どうやらそれはまだ動作します。私は警告をポップアップで生きなければならない:)

1

私はRFC2396 []がURIの有効な文字ではないことを理解しています。あなたのサービスが不正なHTTPリクエストを期待しているように見えます。

query   = *uric 
uric   = reserved | unreserved | escaped 
unreserved = alphanum | mark 
mark   = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" 
reserved  = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 
escaped  = "%" hex hex 

http://www.ietf.org/rfc/rfc2396.txt

+0

それは本当ですが、それはサービスが期待するものであり、私はそれを変更することはできません。それはブラウザを介して動作し、私は実際に解決策を見つけました。私は質問を更新します。 –

+0

RFC 3986(http://tools.ietf.org/html/rfc3986#section-2.2)には、括弧が予約文字として記載されています。ただし、「予約済み」とは、サーバの要件に応じて、特別扱いのみ*対象*となることを意味します。これは、.NETの4.5のすべての現在のHTTPオプションで大きな問題になっています。それらはすべて、ある時点でURIをエスケープします。 – McGuireV10

0

あなたはエンコードされた文字が本当の問題であることを確認していますか?

文字は、WebClientクラスによって正しくエンコードされています。サービスが正しくエンコードされた文字を処理できない場合、サービスは中断されます。

サービスがこのように壊れていて、とにかくそれを使用する必要がある場合は、別の方法でリクエストを送信する必要があります。 %5B%5DにURLエンコード[]

0

をしていることをあなただけのことができるはずですだから、動作するはず

response = client.DownloadString("http://example.com/name2id?names[]=john"); 

をやって文字列

としてURIを渡しますURLをエンコードせずに

私は間違っているかもしれませんが、試してみませんか?

関連する問題