我正在WCF中构建一个新SOAP,以取代已经建立的与客户端服务器的通信中的旧服务。这里的渔获物是:
我设法建立了到客户机的连接,并且正在调用我的操作,但是我没有接收到输入参数。我确信参数是发送的,因为我有另一个解决方案,它像当前客户端一样工作,用于我的测试。当它指向旧API时,一切正常,输入被发送,但是当我将它指向我的API时,它只调用操作,但没有如前所述的输入。
我在测试解决方案中添加了对每个API的服务引用,以查看差异,并注意到输入复杂类型的命名空间是不同的,但下面是我当前的问题:操作的名称与它作为输入参数的复杂类型的名称相同,它们都需要位于同一个名称空间上(我猜想)。我并不认为这是一个问题,但在我的singleWsdl文件中,我可以看到我的所有操作也被列为中的元素,它们的输入嵌套为<complexType>。
我还想知道这个问题是否是我的wsdl文件中的导入问题,还是简单的事实:在已经使用新的wsdl/singleWsdl文件结构建立通信时,正在替换旧的wsdl文件结构,并且它不知道在哪里查找复杂的类型。
旧的API Reference.cs (添加服务引用作为网络引用):
[System.Web.Services.Protocols.SoapRpcMethodAttribute("http://www.namespaceURL.com/InternalApi/UpdateScheduler", RequestNamespace="http://www.namespaceURL.com/InternalApi", ResponseNamespace="http://www.namespaceURL.com/InternalApi", Use=System.Web.Services.Description.SoapBindingUse.Literal)]
[return: System.Xml.Serialization.XmlElementAttribute("return")]
public returnUpdateScheduler UpdateScheduler([System.Xml.Serialization.XmlElementAttribute("UpdateScheduler")] UpdateScheduler UpdateScheduler1) {
object[] results = this.Invoke("UpdateScheduler", new object[] {
UpdateScheduler1});
return ((returnUpdateScheduler)(results[0]));
}新的singleWsdl文件类型:
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.namespaceURL.com/InternalApi">
<xs:import namespace="http://schemas.datacontract.org/2004/07/PairLeague"/>
<xs:element name="UpdateScheduler">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="UpdateScheduler" nillable="true" type="tns:UpdateScheduler"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>新的wsdl文件导入:
<wsdl:types>
<xsd:schema targetNamespace="http://www.namespaceURL.com/Imports">
<xsd:import schemaLocation="http://localhost:18139/IPairLeague.svc?xsd=xsd0" namespace="http://www.namespaceURL.com/InternalApi" />
<xsd:import schemaLocation="http://localhost:18139/IPairLeague.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
<xsd:import schemaLocation="http://localhost:18139/IPairLeague.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/PairLeague" />
</xsd:schema>
</wsdl:types>这是我第一次使用SOAP和WCF,所以我的理解可能是不正确的,或者我可能只是看错了地方。如果有人有任何想法,我将非常感谢您与我分享它。
发布于 2018-02-01 14:54:01
最后的解决方案是将[ServiceContract] OperationFormatStyle of 设置为'Rpc'
[ServiceContract(Namespace = "http://www.example.com/Service"),
XmlSerializerFormat(Style = OperationFormatStyle.Rpc)]在尝试与第三方服务建立连接时,您需要使用相同的名称和名称空间,并匹配相同的消息结构。由于我模拟的是RPC结构的SOAP接口,所以不允许使用MessageContracts,但我需要指定发送DataContracts的消息的结构。通过将样式参数设置为RPC,wsdl中的DataContracts (ComplexTypes)可以在消息标记中正确格式化。如果没有将样式设置为Rpc,则我的操作无法识别任何输入类型参数,而且当我将DataContract设置为MessageContract时,输入类型被识别,但在调用操作时从未填充传递的值。请注意,这只是我基于测试代码的推论,它现在工作的真正原因可能是完全不同的,但最重要的是现在对我来说-它是有效的!
wsdl中的消息元素也被自动格式化,其中包括不正确的名称和命名空间参数。在我的例子中,名称包括我的项目的名称空间、服务名称和特定的操作名称,而我需要它只是操作名称。
我还专注于生成一个没有任何包含的大wsdl文件,因为第三方服务期待这种格式。目前,它似乎没有给我任何问题,但这是可能的,我会遇到一个问题,在稍后的过程中。
我在这个问题上的解决方案是通过NuGet实现NuGet包。在Visual中,您可以通过项目面板菜单打开NuGet包管理器,搜索并安装WCFExtrasPlus包。
要将您的项目设置为使用我遵循的以下说明的包:
http://george2giga.com/development/wcf-merge-wsdl-in-a-single-file/
https://stackoverflow.com/questions/48112733
复制相似问题