В этих вопросах есть полезная информация: Как сгенерировать xs: Date in Параметр 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
и так далее. Если эти классы важны для вашего взаимодействия со службой, мой подход может не сработать для вас.
Изменить:
Что касается свойств, допускающих значение NULL, в этом вопросе есть полезная информация: svcutil.exe - сгенерированный прокси-сервер не позволяет использовать поля, допускающие значение NULL
Чтобы получить свойство, допускающее значение NULL, в сгенерированном прокси-классе, необходимо установить поле 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
значения должны быть yyyy-mm-dd с дополнительной информацией о часовом поясе (w3.org). Если Oracle ожидает даты в другом формате, мне интересно, как они вообще могут быть xs:date
значениями.
Есть ли какая-либо документация или другая информация, которую вы можете предоставить относительно услуги, которую вы пытаетесь использовать?
Изменить 2:
Мне немного неясно, какие именно «даты должны быть в формате базы данных». означает в документации Oracle. Если тип xs:date
, то их сериализация в формат базы данных наверняка будет означать, что это уже не xs:date
?
Тем не менее, вы можете попробовать кое-что в этом отношении:
Возможно, вам придется просто поэкспериментировать, отправив несколько запросов к веб-сервису, чтобы увидеть, как эта дата влияет на вещи.
Вы уверены, что этих *IsSpecified
параметров нет? Чтобы использовать мой класс Contact
в качестве примера, minOccurs=0
в свойстве BirthDate
предоставит классу Contact
дополнительное свойство с именем BirthDateIsSpecified
.
person
nick_w
schedule
28.01.2013
xs:date
. Я назначаю вознаграждение по этому вопросу за решение. - person Alex   schedule 25.01.2013