C# 使用.net和WCF中的Java Web服务时间戳

C# 使用.net和WCF中的Java Web服务时间戳,c#,.net,wcf,web-services,timestamp,C#,.net,Wcf,Web Services,Timestamp,我们正在尝试使用WCF从.NET3.5与一个(可能的)JavaWebService进行对话。WebService定义了一个Timestamp对象,它似乎是一个没有十进制毫秒的datetime WCF决定.NET将使用datatime作为代理类中的对象支持。将带有时间戳的对象发送到Java Web服务器时,datetime将被序列化并包含毫秒。这将导致故障 我们如何a)使.NET选择我们实现的自定义类(以便格式化消息)或b)使WCF基于WSDL中包含的XSD文件生成日期时间 问题定义:时间戳需要如

我们正在尝试使用WCF从.NET3.5与一个(可能的)JavaWebService进行对话。WebService定义了一个Timestamp对象,它似乎是一个没有十进制毫秒的datetime

WCF决定.NET将使用datatime作为代理类中的对象支持。将带有时间戳的对象发送到Java Web服务器时,datetime将被序列化并包含毫秒。这将导致故障

我们如何a)使.NET选择我们实现的自定义类(以便格式化消息)或b)使WCF基于WSDL中包含的XSD文件生成日期时间

问题定义:时间戳需要如下所示: 2010-01-01T01:01:01-07:00

但是.NET会生成一个带有十进制秒数的时间戳,如:
2010-01-01T01:01:01.1234-07:00能否修改代码以将其作为字符串传递,并在.ToString()方法中对其进行格式化,如以下代码段所示

SomeTime.ToString("yyyy-MM-ddThh:mm:ss")
通过“WCF决定.NET将使用datetime”,我感觉您使用visual studio添加了对web服务的引用

相反,我建议使用生成代理,然后将其添加到项目中。通过这种方式,您可以直接编辑代理,并使其按照您需要的方式运行(例如,序列化字符串而不是日期时间,或者以不同的方式格式化)


每当服务合同发生变化时,您都需要创建一个新的代理,并在中合并您的变化,但这通常是为额外的控制支付的一个小代价。

我想出了一些方法来处理这个问题。更复杂的方法包括挂接自定义MessageFormatter端点

我们找到了一个简单的方法

仅当datetime对象具有秒数时,才会生成秒数

我们所做的:

我们创建了一个静态on propertychange事件处理程序,它使用反射来检测日期时间数据类型。当找到时,我们重新创建日期时间,而不使用秒的分数。在我们的情况下,我们根本不在乎秒数。我们将事件连接到一个分部类构造函数中。就这样

当然

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

实际上,要在最后获得时区偏移量,您需要在某个时间执行;是的,你是对的。我们使用VisualStudio添加服务引用。我们确实修改了生成的代码以返回字符串,但希望避免每次更新web服务时都更改代理。我们对Web服务没有任何控制权,而且还有许多开发人员。强迫我们每次更新代码不是理想的解决方案,但肯定不是我们的第一选择。可以让SvcUtil为timestamp选择一个自定义类而不是基类datetime吗?@unknown-我认为您没有抓住这一点。生成自己的代理的意义在于,您可以修改代理,而不是让SvcUtil为您修改代理。谢谢您的回答。我们需要更新服务引用,所以我希望(真的希望)有一种方法可以强制代理生成器第一次正确地创建代理。我们目前正在使用您指定的解决方法。@大卫教练-我认为您不能。这就是不断变化的服务合同糟糕透顶的原因之一-1:永远不要修改生成的代码。svcutil还生成与“添加服务引用”相同的代码。