2011-12-15 15 views
0
私は「+」パスワードフィールドのようcharacteresが含まれていることをPOSTデータを送信するために問題を抱えている

C#のエスケーププラス記号(+)HttpWebRequestの私が使用している

string postData = String.Format("username={0}&password={1}", "anyname", "+13Gt2"); 

のHttpWebRequestとウェブブラウザ結果を見ると、私はにログインしようとすると、HttpWebRequestを使って私のC#WinFormsからウェブサイトにデータをPOSTすると、パスワードが間違っていると伝えられます。 (ソースコード[richTexbox1]とwebBrowser1にあります)。私の別のアカウントでそれをしようとすると、それは「+」文字が含まれていない、それは私が正しく(バイトの配列を使用して、ストリームに書き込む)私はHttpUtility.UrlEncode()があることが判明し、このQuestionから

byte[] byteArray = Encoding.ASCII.GetBytes(postData); //get the data 
request.Method = "POST"; 
request.Accept = "text/html"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = byteArray.Length; 
Stream newStream = request.GetRequestStream(); //open connection 
newStream.Write(byteArray, 0, byteArray.Length); // Send the data. 
newStream.Close(); //this works well if user does not includes symbols 

にログインすることができます無効な文字をエスケープするための解決策は、私はそれを正しく使用する方法を見つけることができません、私の質問は、urlEncode()で私のPOSTデータをURLエンコードした後に私のデータをに正しく送信する方法はありますか?

これは私がそれを動作させる時間にわたってしようとしてきた方法ですが、運、

まず方法

string urlEncoded = HttpUtility.UrlEncode(postData, ASCIIEncoding.ASCII); 
//request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = urlEncoded.Length; 
StreamWriter wr = new StreamWriter(request.GetRequestStream(),ASCIIEncoding.ASCII); 
wr.Write(urlEncoded); //server returns for wrong password. 
wr.Close(); 

第二の方法

byte[] urlEncodedArray = HttpUtility.UrlEncodeToBytes(postData,ASCIIEncoding.ASCII); 
Stream newStream = request.GetRequestStream(); //open connection 
newStream.Write(urlEncodedArray, 0, urlEncodedArray.Length); // Send the data. 
newStream.Close(); //The server tells me the same thing.. 

は私が考えていません私は間違って、URLエンコードされた要求に送信する必要があります、私は本当にいくつかの助けをお願いします、私はGoogleとcoulエンコードされたURLをHttpWebRequestに送信する方法について詳しくは知りません。あなたの時間と注意を感謝します。あなたが私を助けてくれることを願っています。ありがとうございました。

+0

投稿データをエンコードする必要はありません。実際、このようなポストデータをエンコードすると、ブラウザはそれを誤って解釈します。あなたはおそらくあなたのエンコーディングに問題があります。あなたのコンテンツタイプにISO-8859-1を追加して何が起こるかを確認してください。 – Polity

+0

@Polityまず、私に明白にしていただきありがとうございます。私はurlEncodeを使用して特殊文字をエスケープする方法を見つけることができませんでした。 (charset = ISO-8859-1)と同じ結果が残っていますが、何も変更されていません。エンコードされていると思いますが、 '+'はスペースに変換されます。 – WhySoSerious

答えて

2

私はUri.EscapeDataStringそれはまさに私の問題を解決し、何とか私はHttpUtility.UrlEncodeでそれを行うことができませんでしたを使用して私の答えを見つけました。

は、URL文字列をエンコード:周りStackoverflowingは、私はmsdnそれのドキュメントで、URLENCODE方法についてです、このquestionを見つけたことを伝えます。

しかし、POSTデータ(@Marvin、@Polity、訂正ありがとう)をエンコードすると間違っていることが分かりました。それを廃棄した後、私は次のことを試してみました:

string postData = String.Format("username={0}&password={1}", "anyname", Uri.EscapeDataString("+13Gt2")); 

POSTデータが変換されます。msdn

// **Output 
string username = anyname; 
string password = %2B13Gt2; 

Uri.EscapeDataString次の言葉:

そのエスケープに文字列を変換します表現。

私は上記をしようとしたときFORMDATAで「+」文字を含むデータがありますたび、私が正しく投稿できる、私が探していたこの何だと思いますが、何とかそれらについて学ぶことが多くがあります。

このリンクは本当に役立ちます。回答やお時間を

http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx

おかげで多くのことを、私はそれを非常に感謝しています。仲間に感謝します。

-1

送信する投稿データをURLエンコードしないでください。それはないURL

string url = @"http://localhost/WebApp/AddService.asmx/Add"; 
    string postData = "x=6&y=8"; 

    WebRequest req = WebRequest.Create(url); 
    HttpWebRequest httpReq = (HttpWebRequest)req; 

    httpReq.Method = WebRequestMethods.Http.Post; 
    httpReq.ContentType = "application/x-www-form-urlencoded"; 
    Stream s = httpReq.GetRequestStream(); 
    StreamWriter sw = new StreamWriter(s,Encoding.ASCII); 
    sw.Write(postData); 
    sw.Close(); 

    HttpWebResponse httpResp = 
       (HttpWebResponse)httpReq.GetResponse(); 
    s = httpResp.GetResponseStream(); 
    StreamReader sr = new StreamReader(s, Encoding.ASCII); 
    Console.WriteLine(sr.ReadToEnd()); 

これはPOSTDATAをエンコードするためにSystem.Text.Encoding.ASCIIを使用して、FORMDATAです。

この情報がお役に立てば幸い、

+0

これは、問題を解決しないか、より多くのバグを導入します。参照:http://www.w3.org/TR/REC-html40/charset.html#h-5.2.2 HTMLには暗黙的なエンコーディングはありません.HTTPでは、ASCIIではなく、デフォルトのエンコーディングとしてISO-8859-1が使用されています)、 – Polity

+0

こんにちは@Marvin、答えをありがとうが、これは私が自分のコードで行ったことであり、これはまだ "+"文字をエスケープしない、私はそれを使用して参照してくださいpostDataを "エンコード"しようとしたときにASCIIエンコーディングで 'StreamWriter'を使用しています。これは間違っています(皆さんから知っています)。 – WhySoSerious

5

私はあなたにWebClientをお勧めします。あなたのコードを短縮し、エンコーディングやものの世話をします:

using (var client = new WebClient()) 
{ 
    var values = new NameValueCollection 
    { 
     { "username", "anyname" }, 
     { "password", "+13Gt2" }, 
    }; 
    var url = "http://foo.com"; 
    var result = client.UploadValues(url, values); 
} 
+0

ありがとう@ダーリン、残念ながらWebClientはWebClientをサポートしていないので、いつでもこのブラウザがサポートされていません。しかし、WebClientを使用するときにエンコーディングを設定する必要はありませんが、これは '+'文字を渡すときに機能します。私はすでに 'Uri.EscapeDataString'を使って私の答えを見つけました。有益な答えをありがとうございました。 – WhySoSerious

+4

@WhySoSerious、WebサイトはWebClientが何であるかを知らない。 WebサイトはHTTPリクエストをリッスンして応答します。 WebClientはHTTP要求を送信できます。したがって、サイトがブラウザがサポートされていないと言った場合、このサイトではリクエストに特別なUser-Agentヘッダが設定されることが予想されます。そのため、単純にHeadersプロパティを使用して、到達しようとしているサイトが期待するものにUser-Agent HTTP要求ヘッダーを設定します。 –

関連する問題