Добавление "charset" ко всем HTTP-ответам ASP.NET MVC

Есть ли простой способ указать все "обычные" представления - приложение ASP.NET MVC должно иметь charset=utf-8, добавленное к Content-Type? View() не имеет переопределения, которое позволяет вам указать Content-Type и ActionResult, и друзья, похоже, ничего не раскрывают. Очевидно, что мотивация заключается в том, чтобы обойти Internet Explorer, угадывая "правильный" тип кодирования, который я, в свою очередь, хочу сделать, чтобы избежать атак типа XSS UTF-7.

Ответ 1

Возможно, это в вашем web.config будет делать волшебство?

<configuration>
  <system.web>
    <globalization requestEncoding="utf-8" responseEncoding="utf-8" />
  </system.web>
</configuration>

Ответ 2

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

public class CharsetAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Headers["Content-Type"] += ";charset=utf-8";
    }
}

Не стесняйтесь сделать это немного умнее, но это общая идея. Добавьте его в базовый класс контроллера, и все ваше приложение будет закрыто.

Ответ 3

В MVC 5 это может сделать трюк:

public class ResponseCharset : ActionFilterAttribute
{
    private string Charset;

    public ResponseCharset(string charset = "utf-8") {
        Charset = charset;
    }

    public override void OnActionExecuted(HttpActionExecutedContext filterContext)
    {
        filterContext.Response.Content.Headers.ContentType.CharSet = Charset;
    }
} 

Использование:

public class OrderDetailsController : ApiController
{
    [ResponseCharset("utf-8")]  // can be windows-1251 etc.
    public Object Get(string orderId)
    {
       // ....
    }
}

Основываясь на идее @craig-stuntz.

Конечно, вам нужно обеспечить правильную кодировку ответа, то есть кодирование содержимого должно соответствовать таковому, указанному в атрибуте ResponseCharset.

Мне очень помогли, когда я тестировал некоторый код mvc с помощью Chrome, потому что он не указывает кодировку в заголовке accept.