Использование Java WebService TimeStamp из .net и WCF - PullRequest
1 голос
/ 18 сентября 2009

Мы пытаемся поговорить с (возможно) Java WebService из .NET 3.5, используя WCF. WebService определяет объект Timestamp, который выглядит как дата-время без десятичных миллисекунд.

WCF решила, что .NET будет использовать время данных в качестве объекта поддержки в прокси-классе. При отправке объектов с меткой времени в Java WebServer дата и время сериализуются и включают миллисекунды. Это приводит к неисправности.

Как нам а) Заставить .NET выбрать произвольный класс, который мы реализуем (чтобы мы могли отформатировать сообщение) или б) Заставить WCF генерировать дату и время на основе файлов XSD, включенных в WSDL?

Определение проблемы: временная метка должна выглядеть следующим образом: 2010-01-01T01: 01: 01-07: 00

Тем не менее .NET генерирует метку времени с десятичными секундами, например: 2010-01-01T01: 01: 01.1234-07: 00

Ответы [ 3 ]

0 голосов
/ 18 сентября 2009

По словам "WCF решил, что .NET будет использовать дату и время", я чувствую, что вы использовали visual studio, чтобы добавить ссылку на веб-сервис.

Вместо этого я бы порекомендовал использовать SvcUtil для генерации прокси, а затем добавить это в ваш проект. Таким образом, вы можете редактировать прокси напрямую и заставить его вести себя так, как вам нужно (например, сериализовать строку, а не дату и время, или отформатировать ее по-другому).

Каждый раз, когда меняется контракт на обслуживание, вам необходимо создать новый прокси-сервер и объединить ваши изменения, но обычно это небольшая цена за дополнительный контроль.

0 голосов
/ 24 сентября 2009

Я нашел несколько способов справиться с этой проблемой. Более сложные методы включают перехват пользовательской конечной точки MessageFormatter.

Мы нашли простой способ это сделать.

Доли секунд генерируются, только если они есть у объекта datetime.

Что мы сделали:

Мы создали обработчик событий static on propertychange, который использует отражение для обнаружения типов данных 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);
0 голосов
/ 18 сентября 2009

Можете ли вы изменить код, передав его в виде строки, и отформатировать его в методе .ToString (), как показано в следующем фрагменте?

SomeTime.ToString("yyyy-MM-ddThh:mm:ss")
...