Добавление 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.