VS 2008 инструмент wsdl, преобразующий xsd: positiveInteger в строку - PullRequest
1 голос
/ 14 декабря 2009

У меня есть веб-сервис, написанный на C ++ с использованием gSoap. Одним из методов веб-сервиса является

int HS__TBusinessComponentGetContents( xsd__positiveInteger pSession, 
xsd__positiveInteger pComponentType, 
xsd__string pPath, 
xsd__string pFilter, 
xsd__string pChangedAfter, 
xsd__positiveInteger pFlags,
xsd__string &rResult);

Использование этих typedefs:

typedef double                   xsd__double;
typedef wchar_t                 *xsd__string;
typedef bool                     xsd__boolean;
typedef int                      xsd__int;
typedef unsigned long long       xsd__positiveInteger;
typedef wchar_t                 *xsd__datetime;

Я создаю файл wsdl, используя это определение, которое имеет эту (правильную) часть:

Однако, когда я создаю прокси-класс с помощью средства wsdl.exe Visual Studio 2008 для создания класса, который я могу использовать из C #, определение указанных выше методов выглядит следующим образом:

[System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="urn:tango04-hydra-server", ResponseNamespace="urn:tango04-hydra-server")]
    [return: System.Xml.Serialization.SoapElementAttribute("rResult")]
    public string TBusinessComponentGetContents([System.Xml.Serialization.SoapElementAttribute(DataType="positiveInteger")] string pSession, [System.Xml.Serialization.SoapElementAttribute(DataType="positiveInteger")] string pComponentType, string pPath, string pFilter, string pChangedAfter, [System.Xml.Serialization.SoapElementAttribute(DataType="positiveInteger")] string pFlags) {
        object[] results = this.Invoke("TBusinessComponentGetContents", new object[] {
                    pSession,
                    pComponentType,
                    pPath,
                    pFilter,
                    pChangedAfter,
                    pFlags});
        return ((string)(results[0]));
}

WSDL выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="Publisher"
 targetNamespace="http://127.0.0.1:18084/Publisher.wsdl"
 xmlns:tns="http://127.0.0.1:18084/Publisher.wsdl"
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:HS="urn:tango04-hydra-server"
 xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:MIME="http://schemas.xmlsoap.org/wsdl/mime/"
 xmlns:DIME="http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/"
 xmlns:WSDL="http://schemas.xmlsoap.org/wsdl/"
 xmlns="http://schemas.xmlsoap.org/wsdl/">

<types>

 <schema targetNamespace="urn:tango04-hydra-server"
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:HS="urn:tango04-hydra-server"
  xmlns="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="unqualified"
  attributeFormDefault="unqualified">
  <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
 </schema>

</types>

<message name="SessionOpenRequest">
 <part name="vCredentials" type="xsd:string"/>
</message>

<message name="SessionOpenResponse">
 <part name="rResult" type="xsd:positiveInteger"/>
</message>

<message name="SessionCloseRequest">
 <part name="rSession" type="xsd:positiveInteger"/>
</message>

<message name="SessionCloseResponse">
 <part name="rResult" type="xsd:boolean"/>
</message>

<message name="SoapTestRequest">
</message>

<message name="SoapTestResponse">
 <part name="rResult" type="xsd:boolean"/>
</message>

<message name="TBusinessComponentGetContentsRequest">
 <part name="pSession" type="xsd:positiveInteger"/>
 <part name="pComponentType" type="xsd:positiveInteger"/>
 <part name="pPath" type="xsd:string"/>
 <part name="pFilter" type="xsd:string"/>
 <part name="pChangedAfter" type="xsd:string"/>
 <part name="pFlags" type="xsd:positiveInteger"/>
</message>

<message name="TBusinessComponentGetContentsResponse">
 <part name="rResult" type="xsd:string"/>
</message>

<portType name="PublisherPortType">
 <operation name="SessionOpen">
  <documentation>Service definition of function HS__SessionOpen</documentation>
  <input message="tns:SessionOpenRequest"/>
  <output message="tns:SessionOpenResponse"/>
 </operation>
 <operation name="SessionClose">
  <documentation>Service definition of function HS__SessionClose</documentation>
  <input message="tns:SessionCloseRequest"/>
  <output message="tns:SessionCloseResponse"/>
 </operation>
 <operation name="SoapTest">
  <documentation>Service definition of function HS__SoapTest</documentation>
  <input message="tns:SoapTestRequest"/>
  <output message="tns:SoapTestResponse"/>
 </operation>
 <operation name="TBusinessComponentGetContents">
  <documentation>Service definition of function HS__TBusinessComponentGetContents</documentation>
  <input message="tns:TBusinessComponentGetContentsRequest"/>
  <output message="tns:TBusinessComponentGetContentsResponse"/>
 </operation>
</portType>

<binding name="Publisher" type="tns:PublisherPortType">
 <SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
 <operation name="SessionOpen">
  <SOAP:operation style="rpc" soapAction=""/>
  <input>
     <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </input>
  <output>
     <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </output>
 </operation>
 <operation name="SessionClose">
  <SOAP:operation style="rpc" soapAction=""/>
  <input>
     <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </input>
  <output>
     <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </output>
 </operation>
 <operation name="SoapTest">
  <SOAP:operation style="rpc" soapAction=""/>
  <input>
     <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </input>
  <output>
     <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </output>
 </operation>
 <operation name="TBusinessComponentGetContents">
  <SOAP:operation style="rpc" soapAction=""/>
  <input>
     <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </input>
  <output>
     <SOAP:body use="encoded" namespace="urn:tango04-hydra-server" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </output>
 </operation>
</binding>

<service name="Publisher">
 <documentation>Tango/04 Computing Group - Publisher </documentation>
 <port name="Publisher" binding="tns:Publisher">
  <SOAP:address location="http://127.0.0.1:18084"/>
 </port>
</service>

</definitions>

Мой вопрос: почему это происходит? Разве параметры не должны быть целыми числами или длинными длинными значениями вместо строк для параметров, которые в wsdl помечены как xsd: positiveInteger? Что я тут не так делаю?

Спасибо!

1 Ответ

0 голосов
/ 16 декабря 2009

Это может быть не то, что вы хотите увидеть, но это может помочь: Microsoft

В основном это дает вам типы данных .Net, которые связаны с каждым типом данных xsd. На этой странице он показывает PositiveInteger в виде строки. Итак, короче говоря, он делает то, что должен делать. Если вам действительно нужен числовой тип данных, возможно, вы захотите использовать тип данных Unsigned вместо положительного целого числа, если вам нужно, чтобы он всегда был положительным. В противном случае просто используйте соответствующий тип данных xsd, который будет работать для вас. Поскольку, похоже, у вас есть контроль над веб-сервисом и wsdl в c ++, это не должно быть слишком сложным. Если это не то, что вы хотите сделать, вам, вероятно, потребуется добавить логические проверки на клиенте c #, чтобы убедиться, что вы отправляете номер. Поскольку технически все проходит по проводам в виде строки XML, это технически не имеет значения, если служба может правильно сериализовать ваш запрос. Таким образом, имея данные проверяет ваш потребительский объект.

Кроме того, когда в прошлом мне нужно было разрабатывать сервисы, мы всегда вручную кодировали контракты xsd / wsdl, а не позволяли инструментам генерировать их, поэтому мы всегда точно знаем, что мы получим. Не уверен, что это то, что вы сделали, но вы могли бы сделать это также. Когда мы делаем это, мы используем инструмент wsdl для генерации прокси-сервера и клиентского прокси, чтобы вы могли сгенерировать серверную часть в cpp и клиентскую в cs, а затем просто заполнить кишки, как вам нужно.

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...