1

単純なテキストデータをマルチパートフォームCGIに送信しようとしています。

問題は..フォームデータのフォーマット方法がわかりません!

つまり、私のシステムは投稿データを含む文字列を準備し、request.GetRequestStream()を使用してストリームライターを作成し、そのストリームライターに投稿文字列を直接書き込みます。次に、ストリームライターを閉じて、リクエストを送信します。

文字列を次のようにフォーマットしようとしました: "Param1 = sometext&param2 = 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 = "multipart/form-data";。これは役に立ちませんでしたが、そのままにしておきます。

編集:完全なコード:

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();
}

投稿データの送信を処理するコードの部分:

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();
4

1 に答える 1

2

試す:

System.Net.ServicePointManager.Expect100Continue = false;

明らかに、HttpWebRequestはデフォルトでExpectヘッダーを追加しますが、これは多くのサーバーを混乱させます。

更新

次のように戻します。

request.ContentType = "application/x-www-form-urlencoded";

コンテンツタイプと本文のデータの現在の組み合わせが一致しないためです。

于 2010-12-31T23:09:25.097 に答える