2011-08-15 36 views
11

我已經通過從XML模式生成WSDL和類來編寫Java中的JAX-WS webservice。.NET web服務引用生成的類不能使用dateTime類型

我在Visual Studio中將該服務添加爲Web引用,以便與C#.NET客戶端應用程序一起使用。

原始XML模式使用了一些日期/時間類型:xs:date和xs:dateTime用於某些元素。

我的問題是,我的'dateTime'類型無法正常工作。它在生成的類(由Visual Studio 2010中的XMLSerializer生成)中轉換爲.NET DateTime對象(正確),然後我可以創建自己的DateTime對象並在這些類之一上設置DateTime。但是,當將請求發送回服務器時,客戶端應用程序發送的是空值而不是我設置的DateTime對象。所以我猜這是不正確的序列化。

我沒有與'日期'類型相同的問題,序列化/反序列化罰款。

我注意到一些東西,可能是問題,但不知道:

在生成的類DateTime對象看起來是這樣的: [System.Xml.Serialization.XmlElementAttribute(訂單= 10)] 公共系統.DateTime MyDateTime {...}

而在生成的類的時間對象看起來像這樣: [System.Xml.Serialization.XmlElementAttribute(數據類型= 「日期」,訂單= 12)] 公共的System.DateTime MyDate {...}

因此,date對象中有一些額外的信息--DataType =「date」,但dateTime對象沒有DateType。這可能是問題嗎?如果是這樣,爲什麼它不能正確生成類?

感謝您的幫助

+0

注意:dateTime問題只是單向的。當客戶端(.NET)應用程序向服務器發送帶有dateTime元素的請求對象並且服務器接收到空值時,會發生此問題。另一種方式似乎沒有問題(如果服務器發送帶有dateTime元素的響應對象,則客戶端收到具有正確日期/時間信息的DateTime對象的響應) – Josh

+3

請絕對100%確定您確實設置了一個將有效的DateTime VALUE添加到請求中。接下來,請通過在您的客戶端系統上運行Fiddler並檢查請求,驗證您的傳出請求到服務器。請回來你的調查結果。 – kroonwijk

+2

我有類似的問題。在我的案例中,dateTime成員在發送到服務器的xml中被跳過。它與wsdl包含minOccurs =「0」的事實有關。因此,Visual的生成的客戶端包含此字段爲「指定」的標誌。我必須添加:fieldNameSpedified = true;爲每個這樣的領域。這可能也是你的情況。 – bart

回答

2

我在遇到這個問題之前和之後做了很多艱苦的工作,我發現通信的一端是使用英國(dd/MM/yyyy)日期格式,另一端是使用美國(MM/dd/yyyy)格式。這是設置在機器上的全球化文化(如@Gaurav的答案),但是,下面並不是很明顯:

當我在VS下運行我的代碼時我運行自己,因此我自己的文化en- GB。正如你可能知道當我在IIS下運行代碼時,它將在ASPNET帳戶(或NETWORK SERVICE等,取決於IIS的版本)下運行。事實證明,ASPNET帳戶具有en-US的文化,因此是問題所在。

簡單的解決方案是將全局標籤添加到Web。配置並設置文化和uiculture屬性。

3

我正在JBoss機器上使用Livecycle。我把那裏的網絡服務連接到.net。我發現DateTime和Booleans沒有正確翻譯。我知道這是不好的形式,但我把serialize datatype屬性設置爲字符串。這是我可以獲取數據的方式。

我會檢查kroonwijk寫什麼。 Fiddler是檢查服務進行情況的好工具。

+0

用於將DateTime作爲獨立於語言環境的字符串發送。 – SlavaGu

0

如果您在日期時間使用全球化文化信息,則不會發生此類問題。 在這兩個代碼中,你將使用相同的文化信息日期& datetime。在這種情況下,您在兩個代碼中都找到了相同的日期時間格式。

4

我有一個dateTime元素,它在wsdl中不是必需的,即使我在將要發送的.NET對象上設置屬性,它也不會作爲XML傳遞。 (我用.NET Trace log viewer進行了調試)。

後來我意識到我必須將DateTime屬性旁邊提供的布爾值設置爲true,並且它可以工作。 xxxSpecified。見下面的代碼。

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Order=6)] 
public System.DateTime Created { 
    get { 
     return this.createdField; 
    } 
    set { 
     this.createdField = value; 
     this.RaisePropertyChanged("Created"); 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool CreatedSpecified { 
    get { 
     return this.createdFieldSpecified; 
    } 
    set { 
     this.createdFieldSpecified = value; 
     this.RaisePropertyChanged("CreatedSpecified"); 
    } 
} 
相關問題