我们正在尝试使用WCF与.NET 3.5中的(可能的)Java WebService进行通信。 WebService定义了一个Timestamp对象,它似乎是一个没有十进制毫秒的日期时间。
WCF决定.NET将使用数据时间作为代理类中的对象支持。将带有时间戳的对象发送到Java WebServer时,日期时间将被序列化并包含毫秒数。这会导致故障。
我们如何a)导致.NET选择我们实现的自定义类(所以我们可以格式化消息)或b)导致WCF根据WSDL包含的XSD文件生成日期时间?
问题定义:时间戳需要如下所示: 2010-01-01T01:01:01-07:00
然而,.NET生成一个带小数秒的时间戳,如: 2010-01-01T01:01:01.1234-07:00
答案 0 :(得分:0)
您是否可以修改代码以将其作为字符串传递并在.ToString()方法中对其进行格式化,如下面的代码段所示?
SomeTime.ToString("yyyy-MM-ddThh:mm:ss")
答案 1 :(得分:0)
通过“WCF决定.NET将使用日期时间”,我感觉您使用visual studio添加对Web服务的引用。
相反,我建议使用SvcUtil生成代理,然后将其添加到项目中。这样,您可以直接编辑代理并使其按您需要的方式运行(例如,序列化字符串而不是日期时间,或者以不同方式对其进行格式化)。
每当服务合同发生变化时,您都需要创建一个新的代理并合并您的更改,但这通常是为额外控制付出的小代价。
答案 2 :(得分:0)
我找到了一些方法来处理这个问题。更复杂的方法涉及挂钩自定义MessageFormatter端点。
我们找到了一种简单的方法。
仅在datetime对象具有秒数时生成秒数。
我们做了什么:
我们在propertychange事件处理程序上创建了一个static,它使用反射来检测datetime数据类型。找到后,我们重新创建没有秒数的日期时间。在我们的例子中,我们根本不关心秒。我们在一个部分类构造函数中连接事件。多数民众赞成。
当然
public static class DateTimeSecondCatcher
{
PropertyInfo dateTimePropertyInfo = sender.GetType().GetProperty(e.PropertyName);
if ((dateTimePropertyInfo != null) && (dateTimePropertyInfo.PropertyType == typeof(DateTime)))
{
DateTime dteValue = (DateTime)dateTimePropertyInfo.GetValue(sender, null);
if (dteValue.Millisecond > 0)
{
dateTimePropertyInfo.SetValue(sender, new DateTime(dteValue.Year,dteValue.Month,dteValue.Day, dteValue.Hour,dteValue.Minute,dteValue.Second,0,dteValue.Kind), null);
}
}
}
// This code goes in the partial class constructor
this.PropertyChanged += new PropertyChangedEventHandler(DateTimeSecondCatcher.OnPropertyChanged);