2012-02-19 6 views
0

У меня есть веб-действие ASP.NET MVC, которое возвращает простой zip-файл. Свойство Responce.ContentType устанавливается вручную в «text/xml; charset = utf-8; gzip». Это значение заголовка задается перед записью содержимого ответа в выходной поток. Веб-проект размещен на хосте Windows Azure. Проблема в том, что иногда сервер возвращает ответ с отсутствием заголовка ContentType, это вызывает проблемы на стороне клиента. Не имея представления о том, что может быть причиной этого. Когда я запускаю один и тот же веб-проект локально - все работает нормально, поле 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. Спасибо за ваше предложение, я попробую. –

+0

@ Сэм. Шеховцов, ОК. В этом случае это имеет смысл. Но почему бы не придерживаться стандартного HTTP-протокола, который уже предоставляет механизм для указания сжатого ответа? –

Смежные вопросы