У меня проблема с доступом к службе SOAP из проекта Visual Studio 2010 C #. Я выполнил следующие шаги:
- Добавление сервиса в проект
- Создание запроса и отправка
- Успешно получить ответ (можно просмотреть с помощью Fiddler)
Но я получаю сообщение об ошибке при построении объектов ответа в проекте:
Произошла ошибка в документе XML (1, 401). Указанный тип не был распознан: name = ': DataField', namespace = '', at .
Кажется, есть проблема с созданием объекта Array. Кажется, что XML ответа возвращается нормально ... от Fiddler:
HTTP/1.1 200 OK
Date: Tue, 24 Jan 2012 09:58:40 GMT
Server: Apache/2.2.16 (Win32) mod_ssl/2.2.16 OpenSSL/0.9.8o
X-Powered-By: PHP/5.3.5 ZendServer
Set-Cookie: PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxxxx; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-SOAP-Server: NuSOAP/0.9.5 (1.123)
Content-Length: 2055
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getDataFieldsResponse xmlns:ns1="tns">
<return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType=":DataField[12]">
<item xsi:type=":DataField">
<name xsi:type="xsd:string">Windgeschwindigkeit</name>
<ident xsi:type="xsd:string">1002</ident>
</item>
<item xsi:type=":DataField">
<name xsi:type="xsd:string">Windgeschwindigkeit Max</name>
<ident xsi:type="xsd:string">1003</ident>
</item>
<item xsi:type=":DataField">
<name xsi:type="xsd:string">Windgeschwindigkeit Min</name>
<ident xsi:type="xsd:string">1004</ident>
</item>
<item xsi:type=":DataField">
<name xsi:type="xsd:string">Rotordrehzahl</name>
<ident xsi:type="xsd:string">1005</ident>
</item>
<item xsi:type=":DataField">
<name xsi:type="xsd:string">Rotordrehzahl Max</name>
<ident xsi:type="xsd:string">1006</ident>
</item>
<item xsi:type=":DataField">
<name xsi:type="xsd:string">Rotordrehzahl Min</name>
<ident xsi:type="xsd:string">1007</ident>
</item>
<item xsi:type=":DataField">
<name xsi:type="xsd:string">Leistung</name>
<ident xsi:type="xsd:string">1008</ident>
</item>
<item xsi:type=":DataField">
<name xsi:type="xsd:string">Leistung Max</name>
<ident xsi:type="xsd:string">1009</ident>
</item>
<item xsi:type=":DataField">
<name xsi:type="xsd:string">Leistung Min</name>
<ident xsi:type="xsd:string">1010</ident>
</item>
<item xsi:type=":DataField">
<name xsi:type="xsd:string">Windrichtung</name>
<ident xsi:type="xsd:string">1012</ident>
</item>
<item xsi:type=":DataField">
<name xsi:type="xsd:string">Generator Umdr.</name>
<ident xsi:type="xsd:string">1013</ident>
</item>
<item xsi:type=":DataField">
<name xsi:type="xsd:string">Stop Fault</name>
<ident xsi:type="xsd:string">1014</ident>
</item>
</return>
</ns1:getDataFieldsResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Но я не могу построить объекты ответа. Нужно ли пытаться разобрать этот XML вручную? Это было бы много работы, так как мне нужно использовать много разных методов из сервиса ...
Есть еще предложения?
Первые строки WSDL показаны ниже:
<definitions targetNamespace="http://wpr.rotorsoft.net/soap/ROTORsoftService">
<types>
<xsd:schema targetNamespace="http://wpr.rotorsoft.net/soap/ROTORsoftService">
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<xsd:import namespace="http://schemas.xmlsoap.org/wsdl/"/>
<xsd:complexType name="DataClass">
<xsd:all>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="ident" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="DataClassArray">
<xsd:complexContent>
<xsd:restriction base="SOAP-ENC:Array">
<xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="tns:DataClass[]"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="DataField">
<xsd:all>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="ident" type="xsd:string"/>
<xsd:element name="value" type="xsd:string"/>
<xsd:element name="timestamp" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="DataFieldArray">
<xsd:complexContent>
<xsd:restriction base="SOAP-ENC:Array">
<xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="tns:DataField[]"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="PowerUnit">
<xsd:all>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="ident" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="PowerUnitArray">
<xsd:complexContent>
<xsd:restriction base="SOAP-ENC:Array">
<xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="tns:PowerUnit[]"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="DataRecord">
<xsd:all>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="timestamp" type="xsd:string"/>
<xsd:element name="msec" type="xsd:string"/>
<xsd:element name="original" type="xsd:int"/>
<xsd:element name="fields" type="tns:DataFieldArray"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="DataRecordArray">
<xsd:complexContent>
<xsd:restriction base="SOAP-ENC:Array">
<xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="tns:DataRecord[]"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="DataPart">
<xsd:complexContent>
<xsd:restriction base="SOAP-ENC:Array">
<xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="tns:DataRecord[]"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="InfoPart">
<xsd:all>
<xsd:element name="powerunit" type="tns:PowerUnit"/>
<xsd:element name="dataclass" type="tns:DataClass"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="GetDataFormat">
<xsd:all>
<xsd:element name="info" type="tns:InfoPart"/>
<xsd:element name="data" type="tns:DataPart"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="PULogEntry">
<xsd:all>
<xsd:element name="begin" type="xsd:string"/>
<xsd:element name="end" type="xsd:string"/>
<xsd:element name="duration" type="xsd:string"/>
<xsd:element name="error" type="xsd:string"/>
<xsd:element name="errgroup" type="xsd:string"/>
<xsd:element name="repcomment" type="xsd:string"/>
<xsd:element name="puname" type="xsd:string"/>
<xsd:element name="puident" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="PuLogEntryArray">
<xsd:complexContent>
<xsd:restriction base="SOAP-ENC:Array">
<xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="tns:PULogEntry[]"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="FlashData">
<xsd:all>
<xsd:element name="wind" type="xsd:string"/>
<xsd:element name="power" type="xsd:string"/>
<xsd:element name="production" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
</xsd:schema>
</types>
<message name="getDataClassesRequest">
<part name="user" type="xsd:string"/>
<part name="pass" type="xsd:string"/>
<part name="pu_ident" type="xsd:string"/>
</message>
<message name="getDataClassesResponse">
<part name="return" type="tns:DataClassArray"/>
</message>
<message name="getDataFieldsRequest">
<part name="user" type="xsd:string"/>
<part name="pass" type="xsd:string"/>
<part name="pu_ident" type="xsd:string"/>
<part name="dataclass_ident" type="xsd:string"/>
</message>
<message name="getDataFieldsResponse">
<part name="return" type="tns:DataFieldArray"/>
</message>
</definitions>
Из веб-конфигурации клиентского проекта:
<ConsoleApplication1.Properties.Settings>
<setting name="ConsoleApplication1_RotorsoftSoapService_ROTORsoftService"
serializeAs="String">
<value>https://wpr.rotorsoft.net:443/soap.php</value>
</setting>
</ConsoleApplication1.Properties.Settings>
А на C # позвоните в сервис:
RotorsoftSoapService.ROTORsoftService ws = new RotorsoftSoapService.ROTORsoftService();
var fields = ws.getDataFields("username", "password", "NX81307", "10m");
Дайте мне знать, если вам нужна дополнительная информация, и спасибо заранее!
UPDATE:
Я создал класс, полученный из SOAPextension, чтобы я мог изменить входящий XML до процесса десерилизации. Проблема была решена заменой всех ":" на tns: