C# HttpWebRequest多部分表单数据
我正在尝试将简单的文本数据提交到多部分表单CGI 问题是。。我不知道如何格式化表单数据 简而言之,我的系统准备一个包含post数据的字符串,使用request.GetRequestStream()创建一个streamwriter,并直接将post字符串写入该streamwriter。然后关闭streamwriter并发送请求 我尝试将字符串格式化为:“Param1=sometext¶m2=sometext”,但返回错误:C# HttpWebRequest多部分表单数据,c#,httpwebrequest,httpwebresponse,multipartform-data,C#,Httpwebrequest,Httpwebresponse,Multipartform Data,我正在尝试将简单的文本数据提交到多部分表单CGI 问题是。。我不知道如何格式化表单数据 简而言之,我的系统准备一个包含post数据的字符串,使用request.GetRequestStream()创建一个streamwriter,并直接将post字符串写入该streamwriter。然后关闭streamwriter并发送请求 我尝试将字符串格式化为:“Param1=sometext¶m2=sometext”,但返回错误: Unhandled Exception: System.Net.W
Unhandled Exception: System.Net.WebException: The remote server returned an error: (417) Expectation Failed.
at System.Net.HttpWebRequest.CheckFinalStatus (System.Net.WebAsyncResult result) [0x002d9] in /private/tmp/monobuild/build/BUILD/mono-2.8/mcs/class/System/System.Net/HttpWebRequest.cs:1425
at System.Net.HttpWebRequest.SetResponseData (System.Net.WebConnectionData data) [0x00143] in /private/tmp/monobuild/build/BUILD/mono-2.8/mcs/class/System/System.Net/HttpWebRequest.cs:1250
很明显,我把字符串格式化错了,但我一辈子都不知道如何正确地格式化
有人能启发我吗?:)
编辑时,我还尝试更改request.ContentType=“application/x-www-form-urlencoded”代码>到request.ContentType=“多部分/表单数据”代码>。这没有用,但我还是不说了
编辑:完整代码:
public static string sendReq (string url, string pdata)//Pdata is the string containing form data
{
StringBuilder sb = new StringBuilder();
byte[] buf = new byte[8192];
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
CookieCollection jar = new CookieCollection();
jar.Add(new Cookie("Cookie","Data","Removed","For privacy."));
jar.Add(new Cookie("Cookie","Data","Removed","For privacy."));
jar.Add(new Cookie("Cookie","Data","Removed","For privacy."));
jar.Add(new Cookie("Cookie","Data","Removed","For privacy."));
jar.Add(new Cookie("Cookie","Data","Removed","For privacy."));
l("Loading cookie jar onto request");
CookieContainer cont = new CookieContainer();
cont.Add(jar);
request.CookieContainer = cont;
if (pdata != "")
{
request.Method = "POST";
request.ContentType = "multipart/form-data;";
request.ContentLength = pdata.Length;
StreamWriter stOut = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
stOut.Write(pdata);
stOut.Close();
}
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
Stream resStream = response.GetResponseStream();
string tempString = null;
int count = 0;
do
{
count = resStream.Read(buf, 0, buf.Length);
if (count != 0)
{
l("Data was read. ["+count+" bytes]. Encoding to ASCII");
tempString = Encoding.ASCII.GetString(buf, 0, count);
l("Appending to full string");
sb.Append(tempString);
}
}
while (count > 0);
return sb.ToString();
}
处理发送post数据的代码部分:
if (pdata != "")
{
request.Method = "POST";
request.ContentType = "multipart/form-data;";
request.ContentLength = pdata.Length;
StreamWriter stOut = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
stOut.Write(pdata);
stOut.Close();
}
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
尝试:
显然,HttpWebRequest在默认情况下添加了Expect头,这会混淆许多服务器
更新:
恢复到:
request.ContentType = "application/x-www-form-urlencoded";
因为内容类型的当前组合与正文中的数据不匹配。感谢您为我设置格式,Codo:D忘记了我可以这样做。帮了大忙。你能给我们看看你的密码吗?您设置了“Expect”标题了吗?当然,让我很快取出来。。。。。。不,我没有设置“Expect”标题。哇..你能在收到417响应之前发布提交的数据包的标题字段吗?我可能是服务器需要一个“Expect”标题,而你的请求不包含一个标题,反之亦然。你的请求有一个标题,但服务器不知道如何处理。嘿,谢谢你的响应:这有助于消除我所犯的错误。非常感谢。:)
request.ContentType = "application/x-www-form-urlencoded";