我正在使用提供的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>
我认为这是由于在日期时间序列化过程中的往返。有人遇到过这种问题吗?
答案 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时间。