HTTP-заголовок ContentType отсутствует в ответе сервера - PullRequest
0 голосов
/ 19 февраля 2012

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

1 голос
/ 19 февраля 2012

Вы можете написать собственный результат действия:

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 и не беспокоиться о своем коде, либо, если у вас нет доступа к IIS, вы можете просто написать фильтр пользовательских действий :

[OutputCompress]
public ActionResult GetData()
{
    XDocument xml = ...
    byte[] buffer = Encoding.UTF8.GetBytes(xml.ToString());
    return File(buffer, "text/xml; charset=utf-8");
}
0 голосов
/ 19 февраля 2012

попробуйте это:

Response.Clear();    
Response.ContentType = "text/xml; charset=utf-8; gzip";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...