В этих вопросах есть полезная информация: Как создать xs: Date в WCF Параметр OperationContract и Лучшие практики для сериализации DateTime в .NET 3.5 .
Как заявляет Алекс в своем комментарии к вопросу, WCF не поддерживает xs:date
типы.Однако, возможно, точнее сказать, что DataContractSerializer
по умолчанию не поддерживает этот тип, в то время как приведенные выше вопросы показывают, что XmlSerializer
может его обработать.
См. Эту ссылку для DataContractSerializer
против XmlSerializer
сравнения.
Если я запущу:
svcutil http://my_web_site?wsdl /ser:XmlSerializer /d:C:\temp
Затем фрагмент WSDL, подобный этому:
<s:complexType name="Contact">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="BirthDate" type="s:date" />
</s:sequence>
</s:complexType>
Сгенерирован ли этот класс:
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")]
public partial class Contact
{
private System.DateTime birthDateField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(DataType="date", Order=0)]
public System.DateTime BirthDate
{
get
{
return this.birthDateField;
}
set
{
this.birthDateField = value;
}
}
}
При вызове svcutil
создаются два файла: Service1.cs
и output.config
.Если я включу файл кода в проект и добавлю биты system.serviceModel
в файл конфигурации (т. Е. Web.config или app.config), я смогу вызвать службу как обычно.Например:
Service1SoapClient client = new Service1SoapClient("Service1Soap");
var contact = client.GetContact();
Этот подход не лишен недостатков.Файл Service1.cs
заметно отличается, если генерируется без параметра /ser:XmlSerializer
, где вы получите дополнительные классы, такие как WebMethodNameRequest
, WebMethodNameRequestBody
, WebMethodNameReponse
, WebMethodNameReponseBody
и так далее.Если эти классы важны для вашего взаимодействия со службой, мой подход может не сработать для вас.
Редактировать:
С точки зрения свойств, допускающих обнуление, есть некоторые хорошиеинформация в этом вопросе: svcutil.exe - сгенерированный прокси-сервер не допускает пустые поля
Чтобы получить свойство, допускающее обнуление в сгенерированном прокси-классе, поле nillable
должно быть установлено вWSDL.Итак, что-то вроде этого:
<s:element minOccurs="0" maxOccurs="1" name="SomeProperty" type="s:date" nillable="true" />
Создает свойство с именем public System.Nullable<System.DateTime> SomeProperty
в прокси-классе.
Однако в вашем случае вы можете использовать свойство SomePropertySpecified
, чтобы указать наличие илиотсутствие собственности.Эти типы свойств генерируются, когда у вас есть minOccurs="0"
.
С точки зрения форматирования даты, я не уверен.xs:date
значения предназначены для гггг-мм-дд с дополнительной информацией о часовом поясе ( w3.org ).Если Oracle ожидает даты в другом формате, то мне интересно, как они вообще могут иметь значения xs:date
.
Есть ли какая-либо документация или другая информация, которую вы можете предоставить относительно службы, которую вы пытаетесь использовать?
Редактировать 2:
Мне немного неясно, что именно "Даты должны быть в формате базы данных".значит в Oracle документы.Если типом является xs:date
, то их сериализация в формат базы данных наверняка будет означать, что он больше не является xs:date
?
Тем не менее, есть некоторые вещи, которые вы пытаетесь в этом отношении:
Возможно, вам потребуетсяпросто поэкспериментируйте с отправкой нескольких запросов в веб-сервис, чтобы увидеть, как эта дата влияет на вещи.
Вы уверены, что эти параметры *IsSpecified
отсутствуют?Чтобы использовать мой класс Contact
выше в качестве примера, minOccurs=0
для свойства BirthDate
даст классу Contact
дополнительное свойство с именем BirthDateIsSpecified
.
.