C#: 如何通过 WebRequest 发送大字符串?

9

如何在使用POST时上传大字符串(例如带有BLOB的XML)而不会因为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;

应用程序应该被设计成不需要POST发送大量的数据。 - Shamim Hafiz - MSFT
我的看法与此相同。如果你发现“平台”不支持它,请尝试找到另一种方法来实现它。否则,我会采用@Marc Gravell的方法,使用gzip压缩和有限数量的上传。 - Nikos Steiakakis
1个回答

3

是的,这基本上是预期的http行为。

选项:

  • 设置较长的超时时间(您已经完成了此操作),并接受它可能需要很长时间才能合法地超时(而不是因为带宽而花费时间)
  • 也许您可以在请求上应用gzip(并告诉服务器您正在发送压缩的请求)。老实说,我不知道这是否被支持自动地,但api可以明确检查特定的头部并在有效载荷上应用gzip解压缩。
  • 更改api以执行多个小上传和完成消息
  • 接受它

不幸的是,WebService只接受XML字符串。因此我必须使用较长的超时时间。谢谢。 - Wowa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接