Sco*_*ott 14 c# compression httpwebrequest
我试图将数据发布到接受压缩数据的服务器.下面的代码工作正常,但它是未压缩的.我没有使用压缩或Gzip beofre,所以任何帮助都是适当的.
HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;
request.Timeout = 600000;
request.Method = verb; // POST
request.Accept = "text/xml";
if (!string.IsNullOrEmpty(data))
{
request.ContentType = "text/xml";
byte[] byteData = UTF8Encoding.UTF8.GetBytes(data);
request.ContentLength = byteData.Length;
// Here is where I need to compress the above byte array using GZipStream
using (Stream postStream = request.GetRequestStream())
{
postStream.Write(byteData, 0, byteData.Length);
}
}
XmlDocument xmlDoc = new XmlDocument();
HttpWebResponse response = null;
StreamReader reader = null;
try
{
response = request.GetResponse() as HttpWebResponse;
reader = new StreamReader(response.GetResponseStream());
xmlDoc.LoadXml(reader.ReadToEnd());
}
Run Code Online (Sandbox Code Playgroud)
我是否gzip整个字节数组?我是否需要添加其他标题或删除已存在的标题?
谢谢!
斯科特
tny*_*fst 13
要回答您提出的问题,要POST压缩数据,您需要做的就是使用gzip流包装请求流
using (Stream postStream = request.GetRequestStream())
{
using(var zipStream = new GZipStream(postStream, CompressionMode.Compress))
{
zipStream.Write(byteData, 0, byteData.Length);
}
}
Run Code Online (Sandbox Code Playgroud)
这与请求gzip响应完全不同,这是一个更常见的事情.
我还使用类似于 tnyfst 的代码收到了“在写入所有字节之前无法关闭流”错误。问题是我有:
request.ContentLength = binData.Length;
Run Code Online (Sandbox Code Playgroud)
其中 binData 是我压缩前的原始数据。显然压缩内容的长度会有所不同,所以我只是删除了这一行并以以下代码结束:
using (GZipStream zipStream = new GZipStream(request.GetRequestStream(), CompressionMode.Compress))
{
zipStream.Write(binData, 0, binData.Length);
}
Run Code Online (Sandbox Code Playgroud)
Page_Load事件中:
Response.AddHeader("Content-Encoding", "gzip");
Run Code Online (Sandbox Code Playgroud)
对于发出压缩请求:
Rick Strahl的HttpWebRequest 和 GZip Http 响应
| 归档时间: |
|
| 查看次数: |
14685 次 |
| 最近记录: |