将 "charset" 添加到所有 ASP.NET MVC HTTP 响应中

13
有没有简单的办法来指定ASP.NET MVC应用程序中所有“常规”视图将charset = utf-8添加到Content-TypeView()缺少允许您指定Content-Type的重载,而ActionResult和朋友们似乎也没有暴露任何东西。 显然的动机是为了解决Internet Explorer猜测“正确”的编码类型,我又希望这样做以避免UTF-7 XSS攻击。
3个回答

23

也许在你的web.config文件中加入以下内容就可以实现神奇效果了?

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

4
我更喜欢这个建议,尽管我认为两者都可以实现。 - Craig Stuntz
2
仅供参考,requestEncoding和responseEncoding的默认值都是utf-8。请参阅MSDN - Appetere
1
更新了 MSDN 的链接。 - Liam

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

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

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

请随意对其进行优化,但这是一般的想法。将其添加到您的基本控制器类中,整个应用程序都将受到保护。


如果我在集成管道模式下运行,那将非常有效,但是我不认为我被允许以这种方式在IIS6及更早版本上操纵标头,对吗? - Benjamin Pollack
你肯定可以添加它们;我们已经测试过了,它是有效的。不过我还没有尝试过修改现有的标题。试一试吧,很容易测试。 - Craig Stuntz

0
在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 代码时,它帮了我很多忙,因为它没有在接受标头中指定编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接