Использование php веб-службы с C#
Вот мыло wsdl
<element name="transactionCle" nillable="true" type="xsd:int"/>
когда я вызываю WS в PHP, и я показываю мыло с __getLastResponse()
Я получаю это для транзакции:
<transactionCle href="#id50"/>
вот ссылка поля:
<multiRef xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" id="id50" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="soapenc:int">12708584</multiRef>
Я добавил новую WebReference в wsdl, предоставленный сервером Apache, работающим с php.
Сгенерированный прокси-класс дает мне для поля:
private System.Nullable<int> transactionCleField;
/// <remarks/>
[System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
public System.Nullable<int> transactionCle {
get {
return this.transactionCleField;
}
set {
this.transactionCleField = value;
}
}
Теперь моя проблема:
Когда я использую WS в php, значение actionCle равно 12708584
когда я использую WS в C#, значение actionClell равно нулю
Если я вручную изменю класс прокси с System.Nullable на int, а теперь C# даст мне хорошее значение (12708584).
но когда я обновляю Webreference, я должен снова изменить прокси-классы.
Вот мой вопрос: как я могу:
или установить длявестерство тип транзакции без изменения класса прокси?
или заставить сериализацию дать мне хорошую ценность?
редактировать: я не могу изменить WS php или wsdl
1 ответ
Добавьте следующие атрибуты к элементу TransactionsCle в wsdl
minOccurs="1" maxOccurs="1"
Затем восстановите прокси. Если это поможет, то вы можете сделать три вещи:
- изменить сгенерированный прокси вручную (что вы уже упоминали, вы не будете)
- попросить владельца WS расширить сгенерированный wsdl. Это обеспечит.net-совместимость веб-сервиса
- создайте свой собственный прокси-генератор с помощью переопределения методов SchemaImporterExtension. Посмотрите здесь: http://msdn.microsoft.com/en-us/library/system.xml.serialization.advanced.schemaimporterextension.aspx. Также имеется ссылка на загружаемый образец.