3

我想为 wcf 服务创建一种单向方法。一切都很好,除非我想返回故障信息——如果有的话。

我正在为 wsdl 和合同文件使用 wscf 蓝色代码生成器。

在 wsdl 操作元素中,我只有“输入”和“故障”子元素。当我运行该服务时,我得到了无法在单向通信中声明故障消息的信息,并且.. 一种解决方案是将单向设置为 false .. 我所做的并且它工作正常。如果发生错误,我会收到消息。

但是我想知道我是否违反了 Web 服务/wsdl 创建规则......因为从 wsdl 服务模式生成器为我创建了单向通信(设置为“true”)和其他编程语言的生成器可能会做同样的事情...

那么我所做的正确吗?如何更改 wsdl 以便生成器可以适当地创建代码?

如果理论上我不能在单向通信中使用错误,那么我是否需要额外的响应结构来返回任何错误?

谢谢!

4

3 回答 3

4

的确,单向操作不能将故障返回给客户端。如果要在 WCF 中生成void 非单向服务操作,则必须在 WSDL 合同中为该操作添加一个空的输出元素。

基于 .NET 的 WSDL 解析器(例如WSCF.bluesvcutil )将为没有对应元素的<wsdl:operation>元素生成单向服务操作。<wsdl:output>

例如,这个 WSDL 操作是单向的

<wsdl:definitions>
    <wsdl:portType>
        ... 
        <wsdl:operation name="Foo">
           <wsdl:input message="tns:FooRequest" />
        </wsdl:operation>
    </wsdl:portType>
</wsdl:definitions>

另一方面,使用空<wsdl:output>元素(即包含空序列的 XSD 类型)定义操作将映射到 .NET 中的void 非单向方法,该方法可以选择包含错误声明:

<wsdl:definitions>
    <wsdl:portType>
        ... 
        <wsdl:operation name="Foo">
           <wsdl:input message="tns:FooRequest" />
           <wsdl:output message="tns:FooResponse" />
           <wsdl:fault message="tns:FooFault" />
        </wsdl:operation>
    </wsdl:portType>
</wsdl:definitions>

其中<tns:FooResponse>类型被简单地定义为:

<xs:element name="FooResponse">
    <xs:complexType>
        <xs:sequence/>
    </xs:complexType>
</xs:element>
于 2012-03-13T09:11:35.367 回答
1

在 WCF 中,单向意味着操作没有返回值,客户端不关心调用的成功或失败。

在WCF中,我们还有一些其他的操作,自然是单向的,比如你通过WCF操作MSMQ,那么操作一般都设置为单向的。

所以,如果你想返回一些东西来指示调用状态,那么单向不是一个正确的选择,你可以使用不是单向的普通 wcf 操作来代替。

对于单向操作,这里有一篇文章供大家参考WCF ONE-WAY

于 2012-03-13T09:01:42.053 回答
0

我觉得你做的对。对于任何类型的客户端(C#、JAVA、C++、PHP),他们只需要 WSDL 来创建代理。我觉得它也应该适用于其他语言。最好使用 SoapUI(中性 Soap 客户端)来测试您的服务。

于 2012-03-13T09:04:18.500 回答