我有一个ASP.NET MVC Web动作,它返回一个简单的zip文件。 Responce.ContentType属性手动设置为“text / xml; charset = utf-8; gzip”。在将响应内容写入输出流之前设置此标头值。 Web项目托管在Windows Azure托管上。问题是有时服务器返回缺少ContentType标头字段的响应,这会导致客户端出现问题。不知道它可能是什么原因。当我在本地运行相同的Web项目时 - 一切正常,ContentType字段具有适当的值。示例网络操作代码:
public void GetData()
{
Response.ContentType = "text/xml; charset=utf-8; gzip";
XDocument xml = new XDocument(...);//some large XML file
byte[] byteData = Encoding.UTF8.GetBytes(xml.ToString());
Stream outputStream = Response.OutputStream;
GZipStream compressedzipStream = new GZipStream(outputStream, CompressionMode.Compress);
compressedzipStream.Write(byteData, 0, byteData.Length);
compressedzipStream.Close();
}
非常感谢任何帮助。
答案 0 :(得分:1)
您可以编写自定义操作结果:
public class CompressedXDocumentResult : FileResult
{
private readonly XDocument _xdoc;
public CompressedXDocumentResult(XDocument xdoc)
: base("text/xml; charset=utf-8; gzip")
{
_xdoc = xdoc;
}
protected override void WriteFile(HttpResponseBase response)
{
using (var gzip = new GZipStream(response.OutputStream, CompressionMode.Compress))
{
var buffer = Encoding.UTF8.GetBytes(_xdoc.ToString());
gzip.Write(buffer, 0, buffer.Length);
}
}
}
然后:
public ActionResult GetData()
{
XDocument xml = ...
return new CompressedXDocumentResult(xml);
}
另请注意,text/xml; charset=utf-8; gzip
不是标准的HTTP Content-Type
标头。因此,除非您编写一些能够理解它的自定义客户端,否则任何标准浏览器都不可能解析它。
如果您想表明响应已被压缩,您最好使用Content-Encoding标头。您可以直接在IIS级别activate compression for dynamic contents并且不要在代码中烦恼,或者如果您无法访问IIS,则只需编写custom action filter:
[OutputCompress]
public ActionResult GetData()
{
XDocument xml = ...
byte[] buffer = Encoding.UTF8.GetBytes(xml.ToString());
return File(buffer, "text/xml; charset=utf-8");
}
答案 1 :(得分:0)
试试这个:
Response.Clear();
Response.ContentType = "text/xml; charset=utf-8; gzip";