1

URLリクエストに角括弧が必要なWebアドレスからhttp GETを実行しようとしています-次のようなものです:

string requestconstructor = "http://address:port/datalink?test.a[somestuff]"
System.Net.WebClient webClient = new System.Net.WebClient();
string result = webClient.DownloadString(requestconstructor);

webclient エンコーディングを utf8 と ascii に設定しようとしました。また、文字列宣言の角括弧をそれぞれ \u00b5 と \u00b6 に置き換えて直接エンコードしようとしましたが、これらのメソッドのいずれも有効な文字列をサーバーに送信していません. downloadstring 呼び出しで requestconstructor の前に @ 記号を付けてみました...

引用符で囲まれた内容を正確にコピーして Web ブラウザーに貼り付けることができ、完全に機能します。角かっこを必要とせず、機能するサーバーの機能に要求を行うために持っているコードを使用できます。

これらの文字を使用してリクエストを行う方法はありますか?

ありがとうございました!

更新: 手動でエスケープ コードを含め、Uri.EscapeDataString を使用して、提案されたコードを試しましたが、それでも失敗しました。サーバーからコード 500 が返されて失敗するたびに、これは、Web ブラウザーの URL バーで要求を誤って入力した場合に返されるコードと同じです。

問題は、サーバーがこれらの文字がエスケープされていないことを期待していることと、あなたの助けを借りて手動で実行しようとする前から、webclient がそれらを自動的に変換していた可能性があることだと思いますか? エンコードせずに、Web クライアントに文字列をそのまま送信させる方法はありますか? または、特殊文字コードの代わりにプレーン テキストとして [ および ] を送信する .encoding プロパティの設定はありますか? それが、最初の努力で @ を使ってやろうとしていたことです。

更新 2 - リクエストを分析するために Fiddler をロードしました...そして、私の診断は正しかったです...URL を chrome fiddler に入力すると、「[stuff]」が含まれていると表示されます。C# 経由で同じアドレスをロードすると、「%5Bstuff%5D」として出力されます。したがって、C# を説得して、私が入力した方法で URL 要求を送信するだけで、役に立たないようにし、Web 標準に準拠させる必要があります。私はそれを行う方法がわかりません。しかし... 私は何をする必要があるかを知っています。

4

2 に答える 2

2

Webbrower は自動的にエンコードしますが、WebClient はエンコードしません。

有効なエンコードされた URI は"http://address:port/datalink?test.a%5Bsomestuff%5D". コードからエスケープするには、エスケープ方法のいずれかを使用します。

var path = "http://address:port/datalink";
var query = "test.a[somestuff]";
var uri = path + "?" + Uri.EscapeUriString(query);

@""文字列リテラルの解析にのみ影響するため、使用しても効果はありません。

于 2014-08-12T18:41:36.940 に答える
0

私はついに同じ問題を抱えた誰かによる古代の投稿を見つけました! Uri(string, boolean) コンストラクターを使用すると、嘘をついている場合でも、既にすべてのエスケープを行ったことを約束できます。作業コードはこちらです -

 string address = "http://127.0.0.1:8085/datalink?a=stuff[true]";
Uri uri = new Uri(address, true);
WebClient client = new WebClient();
string reply = client.DownloadString(uri);
于 2014-08-13T05:23:20.230 に答える