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

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

3 ответа

Решение

Может быть, это в вашем web.config сделает волшебство?

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

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

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

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

В 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.

Другие вопросы по тегам