2009-11-16 7 views
10

Gibt es eine einfache Möglichkeit zur Angabe aller "normalen" Ansichten ist eine ASP.NET MVC App charset=utf-8 an die Content-Type angehängt werden? View() fehlt eine Überschreibung, mit der Sie die Content-Type und ActionResult angeben können und Freunde scheinen auch nichts auszusetzen. Die Motivation ist offensichtlich, dass Internet Explorer den "richtigen" Kodierungstyp erraten sollte, den ich wiederum machen möchte, um UTF-7 XSS-Attacken zu vermeiden.Hinzufügen von "Charset" zu allen ASP.NET MVC HTTP-Antworten

Antwort

20

Vielleicht macht dies in Ihrer web.config die Magie?

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

+1; Ich mag das besser als mein Vorschlag, obwohl ich glaube, dass beide funktionieren werden. –

+1

Als Referenz ist der Standardwert von requestEncoding und responseEncoding sowieso utf-8. Siehe [MSDN] (http://msdn.microsoft.com/en-us/library/hy4kkhe0.aspx) – Appetere

+0

Aktualisierter Link zu [MSDN] (http://msdn.microsoft.com/en-gb/library/hy4kkhe0 (v = vs.100) .aspx) – Liam

2

Sie könnten ein Attribut für sie schreiben:

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

Fühlen Sie sich frei, um es klüger etwas zu machen, aber das ist die allgemeine Idee. Fügen Sie es zu Ihrer Basis-Controller-Klasse hinzu und Ihre gesamte App ist abgedeckt.

+0

Das würde gut funktionieren, wenn ich im integrierten Pipeline-Modus laufen würde, aber ich glaube nicht, dass ich auf IIS6 und früher ziemlich kopfüber mit Header umgehen darf, oder? –

+0

Sie können sie natürlich hinzufügen; wir haben das getestet und es funktioniert. Ich habe nicht versucht, einen vorhandenen Header zu modifizieren. Versuch es einmal; es ist einfach zu testen. –

0

In MVC 5 dies den Trick tun können:

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; 
    } 
} 

Verbrauch:

public class OrderDetailsController : ApiController 
{ 
    [ResponseCharset("utf-8")] // can be windows-1251 etc. 
    public Object Get(string orderId) 
    { 
     // .... 
    } 
} 

Basierend auf @ craig-Stuntz ‚s Idee.

Natürlich müssen Sie sicherstellen, dass Sie richtige Antwortcodierung geben, d. H. Die Codierung des Inhalts sollte mit der im ResponseCharset-Attribut angegebenen Codierung übereinstimmen.

Es hat mir sehr geholfen, als ich einige Mvc-Code mit Chrome getestet habe, weil es keine Kodierung im Accept-Header spezifiziert.

Verwandte Themen