C # Escape Plus Sign (+) в POST с использованием HttpWebRequest - PullRequest
0 голосов
/ 15 декабря 2011

У меня проблемы с отправкой данных POST, которые включают символы, такие как "+" в поле пароля,

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

Я использую HttpWebRequest и веб-браузер, чтобы увидеть результаты, и когда я пытаюсь войдите из моих C # WinForms, используя HttpWebRequest для отправки данных на сайт, он говорит мне, что пароль неверный.(в исходном коде [richTexbox1] и webBrowser1).Попытка сделать это с другой моей учетной записью, которая не содержит символа «+», позволяет мне правильно войти в систему (используя массив байтов и записать его в поток)

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

Из этого Вопрос Я обнаружил, что HttpUtility.UrlEncode() - это решение, позволяющее избежать недопустимых символов, но я не могу понять, как правильно его использовать, мой вопрос: после URL-кодирования моих данных POST с помощью urlEncode() как отправитьданные для моего запроса правильно?

Вот так я пытался ЧАСЫ, чтобы заставить его работать, но не повезло,

Первый метод

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 и не смог найти больше информации о том, как отправить закодированный URL-адрес на HttpWebRequest. Я ценю ваше время и внимание, надеюсь, вы можете мне помочь.Спасибо.

Ответы [ 3 ]

5 голосов
/ 15 декабря 2011

Я бы порекомендовал вам 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);
}
5 голосов
/ 17 декабря 2011

Я нашел ответ, используя Uri.EscapeDataString, он точно решил мою проблему, но почему-то я не смог сделать это с HttpUtility.UrlEncode. Stackoverflowing вокруг , я нашел этот вопрос о методе urlEncode, в msdn документация говорит, что:

Кодирует строку URL.

Но теперь я знаю, что это неправильно, если используется для кодирования данных POST (@Marvin, @Polity, спасибо за исправление). Отбросив его, я попробовал следующее:

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

Данные POST преобразуются в:

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

Uri.EscapeDataString in msdn говорит следующее:

Преобразует строку в экранированное представление.

Я думаю, что это то, что я искал, когда я попробовал описанное выше, я мог корректно POST, когда есть данные, включая символы '+' в данных форм, но как-то о них можно узнать много.

Эта ссылка действительно полезна.

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

Большое спасибо за ответы и ваше время, я очень ценю это. С уважением товарищи.

0 голосов
/ 15 декабря 2011

отправляемые вами данные НЕ должны быть закодированы 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());

Используется System.Text.Encoding.ASCII для кодирования постданных.

Надеюсь, это поможет,

...