Asp.net mvc 加入“;“字符集”;到所有ASP.NET MVC HTTP响应

Asp.net mvc 加入“;“字符集”;到所有ASP.NET MVC HTTP响应,asp.net-mvc,character-encoding,utf-7,Asp.net Mvc,Character Encoding,Utf 7,如果ASP.NET MVC应用程序的charset=utf-8内容类型,是否有一种简单的方法来指定所有“正常”视图View()缺少一个覆盖,它允许您指定内容类型,ActionResult,而且朋友们似乎也不会公开任何内容。其动机显然是围绕Internet Explorer猜测“正确”的编码类型展开工作,我也希望这样做以避免UTF-7 XSS攻击。您可以为其编写一个属性: public class CharsetAttribute : ActionFilterAttribute { pub

如果ASP.NET MVC应用程序的
charset=utf-8
内容类型,是否有一种简单的方法来指定所有“正常”视图
View()
缺少一个覆盖,它允许您指定
内容类型
ActionResult
,而且朋友们似乎也不会公开任何内容。其动机显然是围绕Internet Explorer猜测“正确”的编码类型展开工作,我也希望这样做以避免UTF-7 XSS攻击。

您可以为其编写一个属性:

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

尽管可以让它变得更聪明一点,但这只是一般的想法。将它添加到您的基本控制器类中,您的整个应用程序都将被覆盖。

也许您的web.config中的这个功能会起到神奇的作用

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

在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属性中指定的匹配


当我用Chrome测试一些mvc代码时,它帮了我很大的忙,因为它没有在accept头中指定编码。

如果我在集成管道模式下运行,那会很好,但我不相信我可以在IIS6和更早的版本中以这种方式处理头,是吗?你当然可以添加它们;我们已经对此进行了测试,并且效果良好。不过,我还没有尝试修改现有的标题。试一试;它很容易测试;虽然我相信两者都会起作用,但我更喜欢这个建议。仅供参考,requestEncoding和responseEncoding的默认值都是utf-8。请参阅更新的链接至