Формат времени WSDL игнорируется из Visual Studio

Файл WSDL от клиента указывает тип данных времени, используя следующий синтаксис: <xsd:simpleType name="time"><xsd:restriction base="xsd:time"><xsd:pattern value="[0-9]{2}:[0-9]{2}:[0-9]{2}"/></xsd:restriction></xsd:simpleType>

Я включил файл WSDL как «Веб-ссылку» (а не как ссылку на службу) в проект Visual Studio C#. Что генерирует этот код:

[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="time")]
public System.DateTime I_TIMETO {
get {
     return this.i_TIMETOField;
}
set {
     this.i_TIMETOField = value;
}

}

Проблема в том, что в сгенерированной полезной нагрузке шаблон из файла WSDL ([0-9]{2}:[0-9]{2}:[0-9]{2}) полностью игнорируется. т.е. полезная нагрузка выглядит так:

<I_TIMETO xmlns="">17:11:00.0000000+01:00</I_TIMETO> 

вместо:

<I_TIMETO xmlns="">17:11:00</I_TIMETO> 

Невозможно изменить веб-сервис, и я не хочу менять автоматически сгенерированный код.


person user3244392    schedule 02.02.2015    source источник
comment
Я не эксперт, но я использую службу WCF и считаю, что нет возможности сохранить форматирование в DateTime. Все, что я делаю, это передаю переменную DateTime, и служба сама ее вычисляет. С другой стороны, если я передаю строковое значение DateTime, мне нужно иметь стандартную строку формата для клиента и сервера.   -  person stripathi    schedule 02.02.2015
comment
К сожалению, это веб-сервис SAP, поэтому я не могу изменить интерфейс.   -  person user3244392    schedule 03.02.2015


Ответы (1)


Я думаю, что хорошего решения нет, поэтому вам нужно отредактировать автоматически сгенерированный код.

Создайте частичный класс автоматически сгенерированного кода и добавьте в него строковое свойство с правильным форматированием:

[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, 
 DataType = "string", ElementName = "I_TIMETO")]
public string I_TIMETO_STR
{
    get
    {
        return this.i_TIMETOField.ToString("HH:mm:ss");
    }
    set
    {
        this.i_TIMETOField = DateTime.ParseExact(value, "HH:mm:ss", CultureInfo.InvariantCulture);
    }
}

Теперь перейдите к автоматически сгенерированному свойству и добавьте XmlIgnore:

[System.Xml.Serialization.XmlIgnore] 
public System.DateTime I_TIMETO{...
person user3244392    schedule 05.02.2015