Вы можете написать собственный результат действия:
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");
}