Server响应中缺少ContentType HTTP标头

时间:2012-02-19 10:26:42

标签: html asp.net-mvc-3 iis-7

我有一个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();
}

非常感谢任何帮助。

2 个答案:

答案 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";