3

提供されているwsdlを使用して、Webサービス(このWebサービスを制御できません)と統合しています。メソッドを呼び出しているときに、リクエストでDateTimeを渡す必要があります。リクエストには、UTC形式の日時が含まれている必要があります(最後にZが含まれます)。リクエストには以下のフィールドが含まれています

[System.Xml.Serialization.XmlElementAttribute(DataType="date", Order=0)]
public System.DateTime date
{
   get
    {
       return this.dateField;
     }
    set
    {
    this.dateField = value;
  }

xsdデータ型は日付であることに注意してください。

DateTimeUtcとして渡すリクエストを作成します。

request.date = DateTime.SpecifyKind(DateTime.Parse(DateTime.Now.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'")), DateTimeKind.Utc);

私が抱えている問題は、UTCとして合格DateTimeしたにもかかわらず、タイムゾーンなしでsoapリクエストが表示されることです。たとえば、リクエストは次のように生成されます。

           <GetRequest xmlns=" http://soa.company.com/services/example/v2"> 
              <date>2001-01-01</date> 
           </GetRequest>

私の期待は、

           <GetRequest xmlns=" http://soa.company.com/services/example/v2"> 
              <date>2001-01-01Z</date> 
           </GetRequest>

これは、日時のシリアル化中のラウンドトリップが原因だと思います。誰かがこの種の問題に直面したことがありますか?

4

3 に答える 3

2

DateTimeあなたができる最も簡単なことは、誰もが常にUTCとして渡されなければならないという合意をすることです。このようにして、処理時間(タイムゾーンをシリアル化するため)とデータサイズを削減します。

于 2012-12-06T10:14:48.537 に答える
1

OK、ついにこれを解決しました。LinkForceXmlSerializerがDateTimeを'YYYY-MM-DD hh:mm:ss'としてシリアル化するのは非常に便利でした。上記のリンクで説明されているものと同様の文字列属性を追加しましたが、これで問題が修正されたようです。

/// <remarks/>
[System.Xml.Serialization.XmlIgnore]
public System.DateTime date
{
    get
    {
        return this.dateField;
    }
    set
    {
        this.dateField = value;
    }
}

/// <remarks/>

[System.Xml.Serialization.XmlElementAttribute("date", Order = 0)]
public System.String somedate
{
    get { return this.date.ToString("yyyy'-'MM'-'dd'Z'"); }
    set { this.date = System.DateTime.Parse(value); }

}

ただし、生成されたプロキシを変更することは、絶対に好ましい方法ではありません。

于 2012-12-07T17:16:17.023 に答える
1

別の問題を扱っている別のstackoverflowリンクから、日時構造体を設定するために次のコードを検討することをお勧めします。

時刻を変更せずにC#DateTimeからUTC時刻

その他は、datetimeで指定された時刻に基づいてUTC時刻として扱われ、Webサービスの最後に「Z」が付いてシリアル化されます。同じ問題が発生していましたが、シリアル化コードを修正しようとするのではなく、datetimeメンバーがUTC時間として扱われていなかったことが根本的な問題のようでした。

于 2017-10-24T21:23:45.043 に答える