Wie die Verwendung eines bestimmten CultureInfo-in Asp.net Web-API
Ich habe vor kurzem Hinzugefügt, WEB-API für eine bestehende VS desktop-Anwendung und alles hat gut funktioniert, bis gestern, als ich hatte, um eine GET-Methode hat drei Parameter, einer von Ihnen ein Datum.
Gut, am Anfang dachte ich, dass ein Stück Kuchen, aber viel zu meiner überraschung bemerkte ich, dass, wenn ich schickte 2014/07/09 (9. Juli) auf dem server, wo die Anwendung installiert wurde, es wurde behandelt wie 2014/09/07 (7. September) und aus diesem Grund alle meine Vergleiche nie gearbeitet.
Habe ich versucht Dinge wie den Wechsel von einer GET-Methode an eine POST-Methode, die änderung meiner Einstellungen regions-und Sprachoptionen, um auf dem selben server, vorbei an dem Datum als String ein, erstellt ein Datetime-Objekt auf dem server mit der Teile der Zeichenfolge. Leider keiner von Ihnen arbeitete.
Dann erinnere ich mich daran, dass diese desktop-Anwendung haben sich einige Methoden auf Ihre WCF-Projekt (das hab ich jetzt vorbei um web-API), dass an Datteln kein problem. Suchen Sie im code für eine Weile fand ich, dass Sie so etwas auf jeden Klasse Sie WCF-Projekt, verwendet Termine:
Imports System.Globalization
Imports System.Security.Permissions
Imports System.Threading
Public Class ServicioRemotoVentas
Implements IServicioRemotoVentas
Public Sub New()
MyBase.New()
Thread.CurrentThread.CurrentCulture = New CultureInfo("es-PE", False)
End Sub
Sicherlich Thread.CurrentThread.CurrentCulture = New CultureInfo("es-PE", False), muss es für etwas.
Jetzt würde ich gerne wissen, wenn Sie verwendet haben, so etwas wie das Web-API vor? wenn ja, wie und wo haben Sie eine solche Konfiguration.
Diese sind die Einstellungen, die auf meinem pc :
Und dies sind die server Einstellungen:
Fast hätte ich vergessen zu erwähnen, dass ich alle übergeben die Daten mit diesem format yyyy/M/d mit all den anderen Parametern, die Verwendung von json.
Ist es vielleicht, dass, wenn der string deserialisiert wird in der Web-API geschieht dies über das system-Datum-format, weil ich noch nicht angeben, die Kultur-info zu nutzen?? oder vielleicht ist es auch eine Json-Fehler beim serialisieren/Deserialisieren der Daten??
Als immer, irgendwelche Tipps oder Ressourcen, die Sie zur Verfügung stellen könnte wäre sehr dankbar.
- Bitte, versuchen Sie, dies zu Lesen stackoverflow.com/a/13550990/1679310, es könnte Ihnen einige Idee, wie man web.config ... vielleicht helfen könnte.
- Danke, ich gebe es zu gehen, aber es sieht aus wie etwas mehr für asp.net MVC und mein problem ist mit Web-API
- Diese Einstellung ist die Laufzeit-Einstellung, d.h. es spielt keine Rolle, wenn Asp.net, mvc, web api.. es ist die Art und Weise, wie zu sagen, was ist die Standard-Kultur, die auf einem server (und die Laufzeit wird sich um uns kümmern, um es auf einem beliebigen thread) oder wenn wir selbst verwenden die user-Kultur (nicht der guten Art und Weise in die web-api, wo wir die JSON verwenden... Kultur-unabhängigen format)
- Danke es funktioniert wie ein Charme. Sorry für die nicht Vertrauen Sie von Anfang an. Es ist nur, dass ich hatte, sahen einige Seiten, die versucht, dies zu ändern, in der WebApiConfig.cs oder Global.asax, dass ich dachte, du hättest missverstanden, was ich beschrieben hatte, in meiner Frage. Also, vielen Dank und nochmals SORRY
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits in den Kommentaren, die ASP.NET runtime bietet eine Lösung für diese Szenarien: es ist die
web.cofig
element<Globalisierung>
- (siehe MSDN<Globalisierung>
- Element)Seine Struktur ist wie folgt definiert:
So, in Fall, dass wir wollen, zu zwingen, server/dev workstation zu handeln
en-US
Kultur sollten wir nutzen, diese expliziten Einstellungen:Dies wird mit der richtigen (gewünschten und eingestellten) Kultur für jede http-Anfrage.
Auch interessant sein könnte, die Standardeinstellung überblick:
Sehen auch ähnlich wie hier:
Es ist in Ihrer Frage erwähnt, dass die Eingabe ein string ist kein datetime-Objekt ("fast hätte ich vergessen zu erwähnen, dass ich alle übergeben die Daten mit diesem format yyyy/M/d").
Ihre service-Schnittstelle nicht gebucht, aber ich denke, dass der parameter Typ ist DateTime, und dies ist der Grund, warum die Deserialisierung ist falsch.
Obwohl die Einstellung gepostet von Radim funktioniert, es ist kein fix sondern ein hack/workaround.
Gibt es zwei empfohlene Möglichkeiten, um dies umzusetzen:
Strings an beiden enden, d.h. die API-parameter sollte auch string-und die API-Spezifikation ist anzugeben, an welchem Datum-format zu verwenden. Die Verwendung Von DateTime.Parse(String, IFormatProvider) und geben Sie die Kultur in den Vertrag (z.B. new CultureInfo("es-PE")), wenn der Eingabe-string umgewandelt DateTime.
https://msdn.microsoft.com/en-gb/kc8s65zs
Verwenden Sie die date-Objekte an beiden enden. In diesem Fall wird der serializer serialisieren das date-Objekt zu einem bekannten -, Kultur-unabhängigen format und die desrializer deserialisiert die Zeichenfolge zu korrigieren DateTime-Objekt.
public void GetOrders(DatetTime fromDate)
Ich würde mich mit #2, da ist generisch und nicht erzwingen, dass der client die Verwendung einer bestimmten Kultur.
Siehe auch:
Die "richtige" JSON-format " Datum