使用HttpWebRequest在POST中使用C#Escape Plus Sign(+)

时间:2011-12-15 09:03:11

标签: c# winforms post httpwebrequest urlencode

我遇到问题,要在密码字段中发送包含“+”等字符的POST数据,

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

我正在使用HttpWebRequest和webbrowser来查看结果,当我尝试使用HttpWebRequest从我的C#WinForms 登录将数据发布到网站时,它告诉我密码不正确。 (在源代码[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

从这个Question我发现HttpUtility.UrlEncode()是逃避非法字符的解决方案,但我无法找到如何正确使用它,我的问题是,在对我的POST数据进行url编码之后使用urlEncode()如何正确地将数据发送到请求

这就是我试图让HOURS工作的方式,但没有运气,

第一种方法

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编码必须发送到请求方面做错了,我真的请求一些帮助,我通过谷歌搜索并找不到更多关于如何将编码的网址发送到HttpWebRequest ..感谢您的时间和关注,希望您能帮助我。谢谢。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:5)

我使用Uri.EscapeDataString找到了我的答案,它完全解决了我的问题,但不知何故,我无法用HttpUtility.UrlEncode来解决问题。 Stackoverflowing around ,我发现这个question与urlEncode方法有关,在msdn文档中告诉我:

  

对网址字符串进行编码。

但我现在知道如果用于编码POST数据是错误的(@Marvin,@ Polity,感谢您的纠正)。丢弃后,我尝试了以下内容:

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

POST数据转换为:

// **Output
string username = anyname;
string password = %2B13Gt2;
msdn中的{p> Uri.EscapeDataString说明如下:

  

将字符串转换为其转义表示形式。

我认为这正是我所寻找的,当我尝试上述内容时,只要有包含' +'的数据,我就可以正确发布。 formdata中的字符,但不知何故,有很多东西需要了解它们。

此链接非常有用。

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

非常感谢您的答案和时间,我非常感激。伙伴。

答案 2 :(得分:-1)

您发送的postdata不应该是URL编码的!它是formdata,而不是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对postdata进行编码。

希望这有帮助,