WCF SOAP服务,单个wsdl,SOAP中的空命名空间:错误,不符合WS-I,BP2019
当用C编写SOAP服务,运行它,然后使用?singlewsdl选项从服务检索WSDL时,生成的WSDL在元素中有一个空的命名空间属性,破坏了使用SoapUI检查的WSI符合性,并导致错误代码BP2019,指示SOAP错误中存在非法命名空间 服务方法位于基本接口中,服务从中派生出自己的接口 定义位于服务接口中:WCF SOAP服务,单个wsdl,SOAP中的空命名空间:错误,不符合WS-I,BP2019,wcf,soap,wsdl,fault,ws-i,Wcf,Soap,Wsdl,Fault,Ws I,当用C编写SOAP服务,运行它,然后使用?singlewsdl选项从服务检索WSDL时,生成的WSDL在元素中有一个空的命名空间属性,破坏了使用SoapUI检查的WSI符合性,并导致错误代码BP2019,指示SOAP错误中存在非法命名空间 服务方法位于基本接口中,服务从中派生出自己的接口 定义位于服务接口中: [OperationContract( Action = "http://mynamespace.com/services/2014/06/23/MyBaseContract/G
[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元素不能有任何名称空间属性
对此我能做些什么吗?您可以通过设置FaultContract属性Namespace属性来解决此问题
[FaultContract(typeof(string), Name="NonsenseFault", Namespace="http://my.nonsense.fault")]
根据WS-I规范,它应该根本没有名称空间。当我指定名称空间时,soap:fault中的名称空间属性仍然为空。您可以保存生成的wsdl,调整名称空间,使用“契约优先”导入测试项目方法,然后查看原始代码和自动生成代码之间的差异。我想使用代码优先的方法,只通过接口和属性定义服务,而不编辑WSDL,然后从中创建契约。事实上,手动删除空名称空间属性并获取符合WS-I的WSDL很容易,但这不是我想要的。它对?WSDL做同样的事情吗?不,对?WSDL没有,但我希望?singlewsdl只包含一个文件,而不与各种XSD混在一起。顺便说一句,当我仅从wsdl在SoapUI中创建一个项目时,它不会创建任何方法调用。你应该试着用一个简单的例子来重现这个问题。特别是,我想知道它是否对所有的错误合同都这样做。我关心的是?wsdl和?singleWsdl之间的区别。