C #: Как отправить большую строку через WebRequest? - PullRequest
9 голосов
/ 15 февраля 2011

как я могу загрузить большую строку (в моем случае XML с BLOB) с POST, не получая Timeout с GetResponse?

Изменение таймаута помогает, но на самом деле это не решение. Если сервер действительно является смертью или POST был прерван, я должен ждать крайнего тайм-аута.

Любая идея?

HttpWebRequest webRequest = null;
string response = "";
byte[] bytes = Encoding.UTF8.GetBytes(xml);

try
{
    webRequest = (HttpWebRequest)WebRequest.Create("http://" + this.host + ":" + this.port);
    webRequest.ContentType = "application/x-www-form-urlencoded";
    webRequest.Method = "POST";
    webRequest.Timeout = 5000;

    webRequest.ContentLength = bytes.Length;
    using (Stream requeststream = webRequest.GetRequestStream())
    {
        requeststream.Write(bytes, 0, bytes.Length);
        requeststream.Close();
    }

    using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
    {
        using (StreamReader sr = new StreamReader(webResponse.GetResponseStream()))
        {
            response = sr.ReadToEnd().Trim();
            sr.Close();
        }
        webResponse.Close();
    }
}
catch(Exception ex)
{
    MessageBox.Show(ex.ToString());
}
return response;

1 Ответ

3 голосов
/ 15 февраля 2011

Да, это вполне ожидаемое поведение http.

Опции:

  • имеет большой тайм-аут (вы уже сделали это) и признаете, что законный тайм-аут может занять много времени (в отличие от некоторого времени из-за пропускной способности)
  • возможно, вы можете применить gzip к запросу (и сообщить серверу, что отправляете его сжатым); Честно говоря, я не знаю, поддерживается ли это автоматически , но это, безусловно, может быть сделано путем явной проверки API для конкретного заголовка и применения распаковки gzip к полезной нагрузке
  • изменить API для выполнения нескольких небольших загрузок и сообщения о завершении
  • жить с этим
...