2014-05-11 7 views
6

Ich habe diesen Schnipsel in meiner cshtml Datei:NancyFx: set Default charset auf UTF8

Expires on: @Model.EndDate.ToString("MMM dd yyyy") 

Und ich dies in der Antwort:

HTTP/1.1 200 OK 
Content-Type: text/html 

... 
Expires on: ׳�׳�׳™ 05 2013 

Wie kann ich feststellen, Nancy UTF8 zu verwenden, indem Standard für Antworten?


Edit: Um zu klären, ist dies nicht ein Lokalisierungsproblem ist, wird der Ausgang bereits lokalisiert - es ist nur, dass die lokalisierte UTF8-String an den Client ohne UTF8 charset Erklärung gesendet wird, so es wird ausgemistet in einem Versuch, es als latin1 zu behandeln.

Was ich suche, ist dies:

HTTP/1.1 200 OK 
Content-Type: text/html; charset=utf-8 

... 

Und ich möchte nicht, dass es individuell für jede Antwort angeben haben.

Ich bin mit dem NancyFx Web-Framework

+0

Was ist die gewünschte Ausgabe? Zum Beispiel ist es "2013 05 April"? Oder möchten Sie einen lokalisierten Monatsnamen? – Kamyar

+0

Das Datum ist lokalisiert, aber die lokalisierte Zeichenfolge geht bei der Codierung verloren. Die Antwort lautet also: Ich möchte einen lokalisierten Monatsnamen. –

+0

Haben Sie versucht, Kultur zu spezifizieren? Zum Beispiel: @ Model.EndDate.ToString ("ddd d MMM", CultureInfo.CreateSpecificCulture ("ar-SA")) – Kamyar

Antwort

8

Wenn Sie UTF8 charset Erklärung angeben möchten in Ihrem Modul Antwort, können Sie eine After interceptor definieren. Hier ist, wie Sie einen After Interceptor in Ihrem Modul Konstruktor definieren:

pipelines.AfterRequest += (ctx) => { ... }; 

aktualisieren:

After += ctx => 
{ 
    ... 
} 

Sie können auch auf Anwendungsebene Haken in Ihrem Bootstrap-Programm definieren Basierend auf den Kommentaren, am besten Ansatz wäre mit dem folgenden Code in den Haken:

+0

Ich erwartete Nancy, etwas dedizierter eingebaut zu haben, aber das löst das Problem. :-) –

+0

Eigentlich funktioniert das nicht ... der Wert, der auf 'Response' gesetzt wurde, wird ignoriert. Wenn Sie den obigen Code auf "NegotiationContext" setzen, dann funktioniert es, aber es verscherzt JSON-Anfragen, weil es aufgerufen wird, bevor der Json-View-Renderer eine Chance hatte, den Inhaltstyp zu setzen. Mit anderen Worten, der erste Teil des if wird niemals aufgerufen. Also die Suche nach der richtigen Antwort geht weiter Ich habe Angst ...: - \ –

+2

OK der richtige Ansatz ist es, 'Response.ContentType' zu ​​verwenden. Da es scheint, dass nur die HtmlResponse nicht mit dem Zeichensatz umgehen kann, ist es sicher, sie auf "if (ctx.Response.ContentType ==" text/html ") zu beschränken. Ctx.Response.ContentType =" text/html; charset = utf8 ";" Wenn Sie Ihre Antwort bearbeiten, akzeptiere ich sie :-) –