Как создать xs: Date в параметре WCF OperationContract - PullRequest
16 голосов
/ 22 апреля 2009

Для параметров в 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.

Ответы [ 5 ]

5 голосов
/ 27 июня 2009

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

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

3 голосов
/ 21 апреля 2011

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

3 голосов
/ 28 июня 2009

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

1 голос
/ 27 июня 2009

Сериализатор 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;}
}

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

1 голос
/ 22 апреля 2009

К сожалению, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...