2009-04-28 9 views
6

Ich habe einen WCF-Dienst ausgeführt, der einige Daten analysieren muss. Es stellt sich heraus, dass Daten (Punkte, Größen) in verschiedenen CultureInfo's unterschiedlich konvertiert werden und das Parsing in vielen Klassen und Methoden verteilt ist. Da das gesamte Parsen durchgeführt wird, ohne CultureInfo zu übergeben, hängt der Erfolg des Parsens von der Thread-Kultur ab.Einstellung CultureInfo auf WCF-Service-Anrufe?

Da es keine programmatische Einstellung von CultureInfo gibt, wählt der Dienst die aktuelle cultureinfo irgendwie aus der Maschine aus. Ich habe keine Ahnung, woher das kommt, denn Änderungen an den Regional- und Sprachoptionen scheinen keine Auswirkungen auf die Kulturinfo des WCF-Dienstes zu haben. Auch Änderungen an der web.config (ja, der Dienst ist in iis gehostet) scheint auch nicht zu funktionieren.

Bin ich wirklich mit nur einer Option übrig? CultureInfo programmatisch setzen? Ich könnte alle Umwandlungsaufrufe finden und CultureInfo übergeben, oder ich könnte es auf Thread.CurrentThread.CurrentCulture setzen. Gibt es keine Möglichkeit, die CultureInfo ein für alle Mal zu setzen - mit Auswirkungen auf alle offengelegten Methoden?

Antwort

5

Die Antwort zur Verwendung des Tags in web.config funktioniert nur, wenn der Asp.net-Kompatibilitätsmodus aktiviert ist. Sie müssen auch die folgenden innen:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 

Ohne Asp.Net Kompatibilitätsmodus wird die HTTP-Module nicht verwendet und der Tag ignoriert.

+0

Ich weiß nicht, warum ich das vermisst habe, danke :) –

3

Sie sollten diesen Blog-Eintrag hier ...

http://blogs.msdn.com/drnick/archive/2008/02/26/using-call-context-initializers-for-culture.aspx

... was zeigt, wie für die Einstellung der Kultur ein Verhalten zu definieren.

JEDOCH sollte web.config hier dein Freund sein. Sie sollten in der Lage sein, die "Standard" -Kultur einzurichten, mit der Ihr Service arbeitet.

Die Globalisierung elemenent ...

http://msdn.microsoft.com/en-us/library/hy4kkhe0.aspx

... erlauben sollten Sie die Kultur und UICulture zu setzen ...

<globalization 
    enableClientBasedCulture="true|false" 
    requestEncoding="any valid encoding string" 
    responseEncoding="any valid encoding string" 
    fileEncoding="any valid encoding string" 

    responseHeaderEncoding = "any valid encoding string" 
    resourceProviderFactoryType = string 
    enableBestFitResponseEncoding = "true|false" 

    culture="any valid culture string" 
    uiCulture="any valid culture string"/> 
+0

Der Blogpost ist nett, aber in meinem Fall würde es bedeuten, den Dienst ein wenig umschreiben, wie für die Globalisierung Element - ich habe es versucht, aber es hat nicht funktioniert - ich denke, ich werde es noch einmal versuchen, vielleicht ich vermasselt up :) –

+0

Das Globalisierungselement scheint keine Auswirkung auf die Kultur des WCF-Threads zu haben. –

+0

Haben Sie noch etwas, das die Kultur beeinflussen könnte? Web.config sollte funktionieren. Gibt es eine Möglichkeit, dass Sie uns den Code zeigen können, der Probleme hat? Sind Sie explizit mit der Kultur, die Sie verwenden? Wenn Sie beispielsweise String.Format aufrufen, verwenden Sie die Überladung, die CultureInfo verwendet? –

0

können Sie die Datei config als Martin erwähnt oben, aber als gute Praxis sollten Sie auf jeden Fall die Kulturinformationen an InvariantCulture einstellen, um Daten zu berücksichtigen, die an verschiedenen Orten gesendet werden. dh Datumsangaben, Zeichenfolgen, Zahlen

+0

Guter Punkt. Dies ist tatsächlich eine Überprüfung der Code-Analyse, wenn VSTS-Code-Analyse verwendet wird. – BinaryMisfit

+0

Ja - wenn Sie den Code über FXCop ausführen und die Globalisierungsregeln überprüfen, werden alle Orte angezeigt, an denen die Kultur definiert werden soll. – Madeleine

+0

Ja, aber das ist Legacy-Code und ich sollte keine Code-Analyse einrichten oder neu schreiben, wenn es überhaupt möglich ist. –