HttpWebRequest multipart form-data - PullRequest
1 голос
/ 01 января 2011

Я пытаюсь отправить простые текстовые данные в 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();

1 Ответ

2 голосов
/ 01 января 2011

Попробуйте:

System.Net.ServicePointManager.Expect100Continue = false;

Очевидно, что HttpWebRequest добавляет заголовок Expect по умолчанию, что сбивает с толку множество серверов.

Обновление :

Возврат к:

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

потому что текущая комбинация типа содержимого и данных в теле не совпадает.

...