传递给Web服务请求时,DateTime字段不会转换为UTC格式

时间:2012-12-05 16:08:09

标签: c# .net wcf datetime serialization

我正在使用提供的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传递,肥皂请求也会显示没有时区。例如,请求生成如下所示,

           <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>

我认为这是由于在日期时间序列化过程中的往返。有人遇到过这种问题吗?

3 个答案:

答案 0 :(得分:2)

您可以做的最简单的事情就是达成协议,每个人都必须始终以DateTime作为UTC。这样,您可以减少处理时间(序列化时区)和数据大小。

答案 1 :(得分: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); }

}

但是,修改生成的代理绝对不是首选方式。

答案 2 :(得分:0)

从处理单独问题的另一个stackoverflow链接,您可能需要考虑以下代码来设置datetime结构:

C# DateTime to UTC Time without changing the time

其他根据datetime指定的时间被视为UTC时间,并在Web服务的末尾以“Z”序列化。我遇到了同样的问题,但是我没有尝试修复序列化代码,而是根本问题似乎是日期时间成员没有被视为UTC时间。