Svcutil генерирует интерфейс без параметров - PullRequest
0 голосов
/ 05 марта 2012

Мне предоставил 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 (запрос на вход в систему)

Имеет ли это какой-то смысл?

1 Ответ

0 голосов
/ 05 марта 2012

На ум приходит пара вариантов:

Смена службы

Смена интерфейса службы.Если вы не являетесь владельцем, конечно, вы не можете его изменить.

Обновите свою структуру ведения журналов

Звучит неинтересно, но теоретически может быть обновлено такчто изменения влияют только на те сервисы, которые действительно имеют параметры, тем самым снижая нагрузку на регрессионное тестирование (тестируйте новый сервис и подмножество старых).

Код вручную своих прокси

Если вам не нравится то, что делает svcutil, заключайте собственные контракты, используя сообщения.Это болезненно с точки зрения обслуживания, но вы можете создавать свои собственные сообщения.

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