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 数据类型是日期。

我构造了DateTime作为 Utc 传递的请求,

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

我遇到的问题是即使我DateTime作为 Utc 传递,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

好的,终于解决了这个问题。Link Force XmlSerializer to serialize DateTime as '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 链接,您可能需要考虑以下代码来设置您的 datetime 结构:

C# DateTime 到 UTC 时间而不更改时间

other 根据 datetime 指定的时间被视为 UTC 时间,并在 Web 服务的末尾使用“Z”进行序列化。我遇到了同样的问题,但不是尝试修复序列化代码,对我来说根本问题似乎是 datetime 成员没有被视为 UTC 时间。

于 2017-10-24T21:23:45.043 回答