WCF SOAP服务,单个wsdl,SOAP中的空命名空间:错误,不符合WS-I,BP2019

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

当用C编写SOAP服务,运行它,然后使用?singlewsdl选项从服务检索WSDL时,生成的WSDL在元素中有一个空的命名空间属性,破坏了使用SoapUI检查的WSI符合性,并导致错误代码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元素不能有任何名称空间属性


对此我能做些什么吗?

您可以通过设置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之间的区别。