簡體   English   中英

從.net和WCF消耗Java Webservice時間戳

[英]Consuming Java Webservice TimeStamp from .net and WCF

我們正在嘗試使用WCF與.NET 3.5中的(可能)Java WebService進行通信。 WebService定義了一個Timestamp對象,該對象似乎是一個不帶小數毫秒的日期時間。

WCF決定.NET將使用datatime作為代理類中的對象支持。 當將帶有時間戳的對象發送到Java WebServer時,日期時間將被序列化並包含毫秒。 這會導致故障。

我們如何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將使用日期時間”,我感到您使用Visual Studio添加了對Web服務的引用。

相反,我建議使用SvcUtil生成代理,然后將其添加到您的項目中。 這樣,您可以直接編輯代理並使其表現出所需的狀態(例如,序列化字符串而不是日期時間,或以其他方式設置其格式)。

每當服務合同更改時,您都需要創建一個新的代理並合並您的更改,但這通常是為支付額外的控制權而付出的很小的代價。

我想出了幾種方法來解決這個問題。 更復雜的方法涉及掛鈎自定義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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM