[英]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.