2012-02-19 255 views
0

我有一个ASP.NET MVC web操作,它返回一个简单的zip文件。 Responce.ContentType属性手动设置为“text/xml; charset = utf-8; gzip”。在将响应内容写入输出流之前设置此标头值。 Web项目托管在Windows Azure托管上。问题是,有时服务器返回丢失ContentType头字段的响应,这会导致客户端出现问题。不知道可能是什么原因。当我在本地运行相同的Web项目时 - 一切正常,ContentType字段具有适当的值。示例网络操作代码:ContentType HTTP标头在服务器响应中缺失

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

试试这个:

Response.Clear();  
Response.ContentType = "text/xml; charset=utf-8; gzip"; 
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标头。您既可以直接activate compression for dynamic contents IIS的水平,不要在你的代码麻烦,或者如果您没有访问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"); 
} 
+0

我在客户端的一些逻辑取决于ContentType值。感谢您的建议,我会尝试。 – 2012-02-19 10:50:49

+0

@ Sam.Shekhovtsov,行。在这种情况下,这确实很有意义。但为什么不坚持已经提供了指示压缩响应机制的标准HTTP协议呢? – 2012-02-19 10:52:32

相关问题