【发布时间】:2015-01-12 13:24:34
【问题描述】:
当使用 C# 编写 SOAP 服务,运行它,然后使用 ?singlewsdl 选项从服务中检索 WSDL 时,生成的 WSDL 在元素中有一个空的命名空间属性,破坏 WSI 合规性(使用 SoapUI 检查)并导致错误代码BP2019,表示soap故障中的命名空间非法。
服务方法位于基础接口中,服务从中派生出自己的接口。
定义在服务接口中:
[OperationContract(
Action = "http://mynamespace.com/services/2014/06/23/MyBaseContract/GetInterfaceVersionRequest",
ReplyAction = "http://mynamespace.com/services/2014/06/23/MyBaseContract/GetInterfaceVersionResponse" )]
[FaultContract(typeof(string), Name="NonsenseFault")]
string GetInterfaceVersion();
使用 ?singlewsdl 的服务生成的 WSDL 包含一个空的命名空间属性:
<wsdl:operation name="GetInterfaceVersion">
<soap:operation soapAction="http://mynamespace.com/services/2014/06/23/MyBaseContract/GetInterfaceVersionRequest" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="NonsenseFault">
<soap:fault use="literal" name="NonsenseFault" namespace=""/> <!-- spoils WS-I compliance! -->
</wsdl:fault>
</wsdl:operation>
根据 WS-I 规则,soap:fault 元素根本不能有命名空间属性。
我可以对此做些什么吗?
【问题讨论】:
-
它和
?wsdl做同样的事情吗? -
不,它不与 ?wsdl 一起使用,但我希望 ?singlewsdl 只有一个文件,而不是与各种 xsd 混淆。顺便说一句,当我在 SoapUI 中仅从 ?wsdl 创建项目时,它不会创建任何方法调用。
-
那里发生了一些奇怪的事情。您应该尝试用更简单的情况重现问题。特别是,我想知道它是否对所有故障合同都这样做。我担心
?wsdl和?singleWsdl之间的区别。