Nachdem ein System mit zwei WCF-Diensten für lokale Umgebung entwickelt und in einer anderen Umgebung getestet wurde, wurde es schließlich in einer Produktionsumgebung implementiert, aber ein völlig anderer Fehler wurde angezeigt. Die zwei Dienste werden auf vier verschiedenen Computern ausgeführt (jeder Dienst wird auf zwei Computern mit Lastenausgleich ausgeführt).Ausnahme Deserialisierung von DateTime als Parameter im WCF-SOAP-Dienst C#
Die Operation InvokeEventWithParameters nicht funktioniert:
[ServiceContract]
public interface IAccountManager
{
[OperationContract]
int InvokeEventWithParameters(string EventName, DateTime InitialDate, DateTime FinalDate, int InitialId, int FinalId, string Username);
[OperationContract]
int InvokeEvent(string EventName, string Username);
}
Beim Versuch, die Dienste ausgeführt werden, wird der folgende Fehler zurückgegeben:
The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation 'InvokeEventWithParameters'. The value '1/1/2014 12:00:00 AM' cannot be parsed as the type 'DateTime'.
Der Fehler auf die Kommunikation zwischen den beiden Diensten angezeigt wird, auf der SOAP-Nachricht. Ich kann nicht überprüfen, ob die ISO 8601 zwischen den Diensten gesendet wird, da sie in der Produktionsumgebung ausgeführt wird. Ich habe die Testumgebung mit einem Sniffer überprüft und die ISO wird eingehalten.
Was ist interessant ist das Format des Datums auf dem Fehler dargestellt, die "en-US" ist, während das System und der IIS als "pt-BR" konfiguriert sind und es sollte auf dem ISO-Standard formatiert werden.
Ich habe bereits versucht, die Konfiguration der Computerkultur, die IIS-Globalisierungskonfiguration und die Kultur in den web.config-Dateien zu ändern. Keine von diesen hat funktioniert. Ich habe das gesamte Projekt nach ".ToStrings" und ".Parses" am Datum überprüft und habe keine gefunden, also gibt es keine andere mögliche Ausnahme.
In meiner Wahrnehmung, DateTime Serialisierung und Deserialisierung auf SOAP-Nachrichten (mit DataContractDeserializer) sollte nicht von Konfigurationen in Bezug auf Kultur beeinflusst werden, aber alles, was ich bei Google gefunden habe und hier war mit diesen Arten von Einstellungen. Stehe ich zu dieser Annahme?
Vielen Dank für die Hilfe, Emilio
Ich glaube nicht, dass OP Daten empfängt, da der Client die Nachricht nicht deserialisieren kann. – Tim
Dies ist der richtige Umgang damit. Sie können nicht garantieren, dass der von Ihnen verwendete Dienst in einem von .NET unterstützten Format zurückgegeben wird. Wenn dies ein Ausnahmefall ist, können Sie die implizite Umwandlung in einen try catch-Block setzen und bei Bedarf auf benutzerdefinierte Formate wie oben zurückgreifen. –
Ich entwickelte beide Dienste mit WCF und SOAP. Dies bedeutet, dass ich den Prozess der Serialisierung und Deserialisierung nicht direkt kontrolliere, da dieser automatisch vom DataContractSerializer generiert werden sollte. Um den Vertrag auf der Client-Seite zu erstellen, habe ich die WSDL mit dem ServiceReference-Tool von C# heruntergeladen, was bedeutet, dass alle Informationen korrekt verbunden sind. –