2016-04-27 62 views
2

在本地環境上開發一個帶有兩個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上發現的所有配置都與這些類型的設置有關。我對這個假設是否正確?

謝謝你的幫助, 埃米利奧

回答

1

我客人這是一個服務端錯誤,它在等待datetime格式,但它得到一個又一個。你能改變那個代碼嗎?如果是這樣嘗試解析接收日期爲有效格式:

DateTime.ParseExact(yourDateParam, "M/d/yyyy hh:mm:ss t", new CultureInfo("en-US"));

講究M/d因爲我不知道你是天(d)或反之亦然之前發送月份(M)。

快樂編碼!

+0

我不認爲OP正在接收數據,因爲客戶端無法反序列化消息。 – Tim

+0

這是處理這個問題的正確方法。您不能保證您正在使用的服務以.NET支持的格式返回。如果這是一個異常情況,您可以將隱式轉換放置在try catch塊中,如果拋出則返回到上面的自定義格式。 –

+0

我使用WCF和SOAP開發了兩種服務。這意味着我不直接控制序列化和反序列化過程,因爲它應該由DataContractSerializer自動生成。 要在客戶端創建合同,我使用C#的ServiceReference工具下載了WSDL,這意味着所有信息都已正確連接。 –