Мне предоставил wsdl-файл от компании, которая будет интегрироваться с нами, подробно описав, как они ожидают, что интерфейс будет выглядеть. Этот файл содержит несколько сообщений и операций, которые имеют объекты запроса и ответа в качестве входных и выходных данных, выглядя так: некоторые опечатки - если так, извините! ):
<wsdl:types>
<xs:schema>
<xs:simpleType name="user_t">
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="password_t">
<xs:restriction base="xs:string">
<xs:minLength value="4" />
<xs:maxLength value="128" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="accountId_t">
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="64" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="language_t">
<xs:restriction base="xs:string">
<xs:length value="2" />
</xs:restriction>
</xs:simpleType>
<xs:element name="logon">
<xs:complexType>
<xs:sequence>
<xs:element name="user" type="ns:user_t" />
<xs:element name="password" type="ns:password_t" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="logonResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="accountId" type="ns:accountId_t" />
<xs:element name="language" type="ns:language_t" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="loginRequest">
<wsdl:part name="parameters" element="ns:login" />
</wsdl:message>
<wsdl:message name="loginResponse">
<wsdl:part name="parameters" element="ns:loginResponse" />
</wsdl:message>
<wsdl:operation name="login">
<wsdl:input message="ns:loginRequest" />
<wsdl:output message="ns:loginResponse" />
<wsdl:fault message="ns:InvalidUserException" name="InvalidUserException" />
</wsdl:operation>
Затем я запускаю svcutil
для этого файла, чтобы создать интерфейс. Я ожидаю, что метод входа выглядит примерно так (язык реализации - C #):
loginResponse login(loginRequest request)
Однако я получаю следующее:
string login(string user, string password, out string language)
Это вызывает проблему не только потому, что здесь не совсем нормально использовать параметры в wcf, но и потому, что наша структура ведения журнала взрывается, когда у wcf-сервисов есть out-параметры (мы действительно хотим чтобы избежать изменений в структуре ведения журнала, поскольку это потребовало бы очень очень тщательного тестирования, поскольку это изменило бы все, везде).
РЕДАКТИРОВАТЬ: Участок утолщается. В wsdl есть один метод, который генерируется, как я и ожидал. Он определен в точно так же, как и другие операции, за исключением того, что элемент ответа пуст:
<xs:element name="fooResponse">
</xs:element>
Если я изменю элемент logonResponse
так, чтобы он был пустым, tada! , он будет работать:
loginResponse login (запрос на вход в систему)
Имеет ли это какой-то смысл?