首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SOAP : OperationContract未接收输入参数

SOAP : OperationContract未接收输入参数
EN

Stack Overflow用户
提问于 2018-01-05 11:29:15
回答 1查看 584关注 0票数 1

我正在WCF中构建一个新SOAP,以取代已经建立的与客户端服务器的通信中的旧服务。这里的渔获物是:

  • 我不允许编辑客户端。
  • 当前的API (我正在替换的API)非常老,它生成wsdl文件中的所有内容,而不是singleWsdl和wsdl。

我设法建立了到客户机的连接,并且正在调用我的操作,但是我没有接收到输入参数。我确信参数是发送的,因为我有另一个解决方案,它像当前客户端一样工作,用于我的测试。当它指向旧API时,一切正常,输入被发送,但是当我将它指向我的API时,它只调用操作,但没有如前所述的输入。

我在测试解决方案中添加了对每个API的服务引用,以查看差异,并注意到输入复杂类型的命名空间是不同的,但下面是我当前的问题:操作的名称与它作为输入参数的复杂类型的名称相同,它们都需要位于同一个名称空间上(我猜想)。我并不认为这是一个问题,但在我的singleWsdl文件中,我可以看到我的所有操作也被列为中的元素,它们的输入嵌套为<complexType>

我还想知道这个问题是否是我的wsdl文件中的导入问题,还是简单的事实:在已经使用新的wsdl/singleWsdl文件结构建立通信时,正在替换旧的wsdl文件结构,并且它不知道在哪里查找复杂的类型。

旧的API Reference.cs (添加服务引用作为网络引用):

代码语言:javascript
复制
[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文件类型:

代码语言:javascript
复制
<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文件导入:

代码语言:javascript
复制
<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,所以我的理解可能是不正确的,或者我可能只是看错了地方。如果有人有任何想法,我将非常感谢您与我分享它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-01 14:54:01

最后的解决方案是将[ServiceContract] OperationFormatStyle of 设置为'Rpc'

代码语言:javascript
复制
[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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48112733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档