在本地環境上開發一個帶有兩個WCF服務的系統並在另一個環境中測試它之後,我們最終將其部署到生產環境,但顯示了完全不同的錯誤。這兩種服務在四臺不同的機器上運行(每臺服務在兩臺負載均衡的機器上運行)。異常反序列化DateTime作爲WCF SOAP服務的參數C#
操作InvokeEventWithParameters不工作:
[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);
}
當試圖運行的服務,將返回以下錯誤:
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'.
顯示在兩個服務之間的通信錯誤,在SOAP消息上。我無法檢查ISO 8601是否在服務之間發送,因爲它正在生產環境中運行。我使用嗅探器檢查了測試環境,ISO正在得到遵守。
有趣的是錯誤上顯示的日期格式是'en-US',而系統和IIS配置爲'pt-BR',它應該根據ISO標準進行格式化。
我已經嘗試更改機器文化配置,IIS全球化配置和web.config文件的文化。這些都沒有奏效。我在日期時間檢查了整個項目的「.ToStrings」和「.Parses」,但沒有發現任何項目,所以沒有其他可能的例外來源。
在我的理解中,關於SOAP消息的DateTime序列化和反序列化(使用DataContractDeserializer)不應該受到有關文化的任何配置的影響,但我在google上發現的所有配置都與這些類型的設置有關。我對這個假設是否正確?
謝謝你的幫助, 埃米利奧
我不認爲OP正在接收數據,因爲客戶端無法反序列化消息。 – Tim
這是處理這個問題的正確方法。您不能保證您正在使用的服務以.NET支持的格式返回。如果這是一個異常情況,您可以將隱式轉換放置在try catch塊中,如果拋出則返回到上面的自定義格式。 –
我使用WCF和SOAP開發了兩種服務。這意味着我不直接控制序列化和反序列化過程,因爲它應該由DataContractSerializer自動生成。 要在客戶端創建合同,我使用C#的ServiceReference工具下載了WSDL,這意味着所有信息都已正確連接。 –