Подтвердить что ты не робот

Как генерировать xs: Date в параметре WCF OperationContract

Для параметров OperationContract, которые представляют только дату (без компонента времени или указателя часового пояса), желательно использовать xs: Date, чтобы избежать какой-либо двусмысленности или проблем с преобразованием часового пояса между клиентом и сервером.

В настоящее время WCF поддерживает только xs: DateTime для сериализации параметров DateTime.

Каков самый простой способ создания OperationContract с параметром, который будет сериализован как xs: Date?

Я думаю о том, что пользовательский .NET-тип "public struct DateOnly" или аналогичный, с неявным литьем в/из стандартного DateTime, который каким-то образом автоматически генерирует wsdl как xs: Date.

Возможно ли это, и как я могу его реализовать?

Если возможно, я подозреваю, что решение может включать использование XmlSchemaProviderAttribute в настраиваемом типе, но любая документация, которую я нашел в этом атрибуте, кажется немного непрозрачной.

Обновление

Мне трудно поверить, что это увеличит вероятность получения решения, но я буду следовать рекомендациям сайта и начинаю щедрость.

Для большей ясности условие для награды - предоставить всю информацию, необходимую для построения решения, так что параметр для WCF OperationContract может быть:

  • сериализован как ws: Date и описан как таковой в сгенерированном WSDL.

  • является либо значением System.DateTime, либо может быть введено неявно в/из DateTime.

4b9b3361

Ответ 1

Теперь, когда это привлекло мое внимание, я создал новое предложение в Connect, Пожалуйста, полностью поддерживайте xs: Дата для параметров только для даты и данных. Я оценил это с четырьмя звездами (важно).

Если кто-либо читает это, это важно (или иначе не согласен), пожалуйста, используйте Connect, чтобы проголосовать за него или прокомментировать его.

Ответ 2

Вы указали требование наличия xs: Date в качестве параметра в операции. Дело в том, что существует формальный способ определения таких требований: WSDL. Если бы я делал это, я бы использовал первый подход WSDL. Начните с WSDL, который определяет требуемый контракт, включая xs: date в интерфейсе, где бы вы этого ни хотели. Затем создайте служебную заглушку, используя svcutil.exe. Не забудьте передать /serializer: xmlSerializer.

Ответ 3

Я также описал проблему. Я разработал собственное решение - специальный тип WcfDate. Он публикуется здесь: Поддержка WCF для xs: date

Ответ 4

К сожалению, WCF не поддерживает тип xs: Date. Вам нужно будет создать собственную структуру DateOnly, например:

<DataContract()> _
public struct DateOnly
   <DataMember()> public Month as Integer
   <DataMember()> public Day as Integer
   <DataMember()> public Year as Integer
end struct

Ответ 5

Сепаратор селектора WCF (DataContractSerializer) не поддерживает его. Но XmlSerializer поддерживает его.

1 - добавьте к вашему контракту атрибут [XmlSerializerFormat]...

[XmlSerializerFormat]
[ServiceContract]
public interface IMyContract
{
   MyType GetData();
}

2 - В типе DataContract добавьте элемент [XmlElement (DataType = "date]) к члену.

public class MyType
{
     [XmlElement(DataType = "date")]
     public DateTime BirthDate {get; set;}
}

Надеюсь, что это поможет