Svcutil生成带有out参数的接口

时间:2012-03-05 18:27:35

标签: c# wcf wsdl

我已经获得了一个与我们集成的公司的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(loginRequest request)

这有意义吗?

1 个答案:

答案 0 :(得分:0)

我想到了几个选项:

更改服务

更改服务界面。如果你不拥有,当然你无法改变它。

更新您的日志框架

听起来不是很有趣,但理论上可以更新,以便更改只影响那些实际具有参数的服务,从而减少回归测试负载(测试新服务和旧服务的子集)。

手动编码您自己的代理

如果您不喜欢svcutil正在做的事情,请使用消息制作您自己的合同。从维护的角度来看,这很痛苦,但你可以制作自己的消息。