Как генерировать 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.
Ответы
Ответ 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;}
}
Надеюсь, что это поможет