C# HttpWebRequest多部分表单数据

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

我正在尝试将简单的文本数据提交到多部分表单CGI

问题是。。我不知道如何格式化表单数据

简而言之,我的系统准备一个包含post数据的字符串,使用request.GetRequestStream()创建一个streamwriter,并直接将post字符串写入该streamwriter。然后关闭streamwriter并发送请求

我尝试将字符串格式化为:“Param1=sometext¶m2=sometext”,但返回错误:

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";