2009-11-16 86 views
10

是否有一種簡單的方法來指定所有「正常」視圖是ASP.NET MVC應用程序將charset=utf-8追加到Content-TypeView()缺少一個覆蓋,允許您指定Content-TypeActionResult和朋友似乎也沒有暴露任何東西。動機顯然是爲了繞過Internet Explorer猜測「正確的」編碼類型,我反過來希望避免UTF-7 XSS攻擊。將「charset」添加到所有ASP.NET MVC HTTP響應

回答

20

也許這在你的web.config會做到神奇?

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

+1;我比我的建議更喜歡這個,儘管我相信兩者都可以發揮作用。 – 2009-11-16 18:48:42

+1

僅供參考,無論如何,requestEncoding和responseEncoding的默認值都是utf-8。請參閱[MSDN](http://msdn.microsoft.com/zh-cn/library/hy4kkhe0.aspx) – Appetere 2012-03-16 09:08:35

+0

已更新的[MSDN]鏈接(http://msdn.microsoft.com/zh-cn/library/hy4kkhe0 (v = VS.100)的.aspx) – Liam 2014-10-28 12:37:33

2

你可以寫一個屬性是:

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

隨意使它有點聰明,但這是一般的想法。將它添加到你的基礎控制器類,你的整個應用程序都被覆蓋了。

+0

如果我在集成管道模式下運行,那會很好用,但我不相信我可以在IIS6和更早版本中以相當的方式使用標頭,我呢? – 2009-11-16 18:37:42

+0

你當然可以添加它們;我們已經測試了這個,它工作。不過,我還沒有嘗試修改現有的標題。試一試;它很容易測試。 – 2009-11-16 18:48:11

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) 
    { 
     // .... 
    } 
} 

基於@克雷格 - 斯頓茨的想法。

當然,您需要確保您提供正確的響應編碼,即內容的編碼應該與ResponseCharset屬性中指定的編碼相匹配。

當我使用Chrome測試一些mvc代碼時,它幫助了我很多,因爲它沒有在accept頭中指定編碼。

相關問題