我想为wcf服务创建一个单向方法。一切都没问题,除非 我想返回错误信息 - 如果有的话。
我正在为wsdl和合同文件使用wscf蓝色代码生成器。
在wsdl操作元素中,我只有'Input'和'Fault'子元素。 当我运行服务时,我得到了无法在单向通信中声明故障消息的信息,并且其中一个解决方案是将单向设置为false ..我做了什么以及它工作正常。如果发生错误,我会收到消息。
但是我想知道我是否打破了web服务/ wsdl创建规则...因为从wsdl服务模式生成器为我创建单向通信(设置为'true')和其他编程语言中的其他编译器可能会生成做同样的事情......
所以我做了什么?如何更改wsdl以便生成器可以适当地创建代码?
如果理论上我不能在单向通信中使用错误那么我是否需要额外的结构来响应以返回任何错误?
谢谢!
答案 0 :(得分:4)
one-way operations can't return faults对客户来说确实如此。如果要在WCF中生成void
而不是单向服务操作,则必须在WSDL协定中为该操作添加空输出元素。
基于.NET的WSDL解析器(例如WSCF.blue和svcutil)将为不拥有的<wsdl:operation>
元素生成单向服务操作相应的<wsdl:output>
元素。
例如,这个WSDL操作is one-way:
<wsdl:definitions>
<wsdl:portType>
...
<wsdl:operation name="Foo">
<wsdl:input message="tns:FooRequest" />
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
另一方面,使用空<wsdl:output>
元素定义操作(即包含空序列的XSD类型)将映射到void
不是.NET中的单向方法,可以选择包含错误声明:
<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>
答案 1 :(得分:1)
在WCF中,单向意味着操作没有返回值,客户端不关心调用的成功或失败。
在WCF中,我们还有其他一些自然是单向的操作,例如你通过WCF操作MSMQ,然后操作通常设置为单向。
所以,如果你想返回一些东西来表示调用状态,那么单向不是一个正确的选择,你可以只使用普通的wcf操作,而不是单向操作。
对于单向操作,这里有一篇文章供您参考WCF ONE-WAY
答案 2 :(得分:0)
我觉得你做对了。对于任何类型的客户端(C#,JAVA,C ++,PHP),他们只需要WSDL来创建代理。我觉得它也适用于其他语言。最好使用SoapUI(中性肥皂客户端)来测试您的服务。