从.net和WCF使用Java Web Service TimeStamp

时间:2009-09-17 21:02:05

标签: c# .net wcf web-services timestamp

我们正在尝试使用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

3 个答案:

答案 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);