2011-08-15 3 views
11

XMLスキーマからWSDLとクラスを生成してJavaでJAX-WS Webサービスを作成しました。.NET Webサービス参照生成クラスがdateTime型で動作しない

私はC#.NETクライアントアプリケーションで使用するために、ビジュアルスタジオでWeb参照としてサービスを追加しています。

元のXMLスキーマでは、いくつかの要素のxs:dateとxs:dateTimeの2つの日付/時刻型が使用されています。

私の問題は、私の 'dateTime'タイプが正しく動作していないことです。生成されたクラス(Visual Studio 2010のXMLSerializerによって生成される)で.NET DateTimeオブジェクト(正しく)に変換され、独自のDateTimeオブジェクトを作成し、これらのクラスのいずれかでDateTimeを設定できます。しかし、リクエストをサーバーに送り返すとき、クライアントアプリケーションは、設定したDateTimeオブジェクトの代わりにnull値を送信しています。だから私はそれが正しくシリアル化されていないと思います。

私は '日付'型で同じ問題を抱えていません。この型は、シリアル化/デシリアライズされています。

私は必ず問題になる可能性が何かに​​気づいたが、ありません:

生成されたクラスでのDateTimeオブジェクトは次のようになります。 [System.Xml.Serialization.XmlElementAttribute(注文= 10)] 公共システム.DateTime MyDateTime {...}

生成されたクラスの日付オブジェクトは次のようになり、一方: [System.Xml.Serialization.XmlElementAttribute(データ型が= "日付"、注文= 12)] 公共のSystem.DateTime MyDate {...}

Dateオブジェクトには、DataType = "date"という追加情報がありますが、dateTimeオブジェクトのDateTypeはありません。これが問題だろうか?もしそうなら、クラスが正しく生成されないのはなぜですか?私はJBossのマシン上でのLiveCycleで働いていた任意のヘルプ

+0

注:dateTimeの問題は単方向性の問題です。この問題は、クライアント(.NET)アプリケーションがdateTime要素を持つ要求オブジェクトをサーバーに送信し、サーバーがNULL値を受け取るときに発生します。もう1つの方法は問題ありません(サーバーがdateTime要素を含む応答オブジェクトを送信する場合、クライアントは正しい日付/時刻情報を持つDateTimeオブジェクトで応答を受信します) – Josh

+3

実際に有効なDateTime VALUEを要求に追加します。次に、クライアントシステムでFiddlerを実行し、要求を確認して、送信要求をサーバーに検証してください。あなたの発見と一緒に戻ってください。 – kroonwijk

+2

私は同様の問題を抱えていました。私のケースでは、dateTimeメンバはサーバーに送信されたxmlでスキップされました。これは、wsdlにminOccurs = "0"が含まれているという事実に関連していました。その結果、Visualの生成されたクライアントには、このフィールドが '指定された'フラグが含まれます。私は追加しておく必要があります:fieldNameSpedified = true;そのようなフィールドごとに。あなたの場合もそうです。 – bart

答えて

2

私は通信の一端が英国(dd/MM/yyyy)の日付形式を使用していて、もう一方が米国(MM/DD/yyyy)形式です。

私はVSの下で自分のコードを走らせたとき、自分自身として走り、それで私自身のen-cultureの文化を実行しました。これは、@ Gauravの答えのように、マシン上のグローバリゼーション文化に設定されています。 GB。 IISでコードを実行するとわかるかもしれませんが、ASPNETアカウント(またはIISのバージョンによってはNETWORK SERVICEなど)の下で実行されます。 ASPNETアカウントはen-​​USの文化を持っていることが判明しました。

単純な解決策は、Webにグローバリゼーションタグを追加することです。文化と養蚕の属性を設定し、設定します。

3

ため

感謝。私はそこから.netにWebサービスを接続しました。 DateTimeとBooleansが正しく翻訳されていないことがわかりました。私はそれが良い形式ではないことを知っているが、私はstringにserializeデータ型属性を置く。それがデータを手に入れる方法でした。

私はkroonwijkが書いたものをチェックします。フィドラーは、サービスの出入りをチェックするのに最適なツールです。

+0

ロケールに依存しない文字列としてDateTimeを送信する場合は+1します。 – SlavaGu

0

グローバル化カルチャ情報を日付時刻に使用している場合、このタイプの問題は発生しません。 両方のコードでは、同じ文化情報を日付& datetimeに使用します。その場合、両方のコードで同じdatetime形式が見つかりました。

4

wsdlでは必須ではないdateTime要素がありました。送信される.NETオブジェクトにプロパティを設定しても、XMLとして渡されませんでした。 (私は.NET Trace log viewerでデバッグを行った)。

後で私は、DateTimeプロパティの隣に指定されたブール値をtrueに設定しなければならないことに気付きました。 xxxは指定されています。以下のコードを参照してください。

/// <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"); 
    } 
} 
関連する問題