wcf - 添加服务引用正在生成消息契约

标签 wcf web-services visual-studio-2008 messagecontract

当我在 Visual Studio 2008 (SP1) 上使用“添加服务引用”导入给定服务时,所有请求/响应消息都被不必要地包装到消息契约中(命名为 -->“操作名称”+“请求”/)响应” + 最后的“1”)。

代码生成器说:

// CODEGEN: Generating message contract since the operation XXX is neither RPC nor 
// document wrapped.

从 Java 服务生成 wsdl 的人说他们正在指定 DOCUMENT-LITERAL/WRAPPED

任何帮助/指针/线索将不胜感激。

更新: 这是我的 wsdl 示例,其中包含看起来可疑的操作之一。请注意,与响应相比,请求的消息元素属性不匹配。

<!- imports namespaces and defines elements -->
<wsdl:types>
  <xsd:schema targetNamespace="http://WHATEVER/" xmlns:xsd_1="http://WHATEVER_1/" xmlns:xsd_2="http://WHATEVER_2/">
      <xsd:import namespace="http://WHATEVER_1/" schemaLocation="WHATEVER_1.xsd"/>
      <xsd:import namespace="http://WHATEVER_2/" schemaLocation="WHATEVER_2.xsd"/>
      <xsd:element name="myOperationResponse" type="xsd_1:MyOperationResponse"/>
      <xsd:element name="myOperation" type="xsd_1:MyOperationRequest"/>
   </xsd:schema>
</wsdl:types>

<!- declares messages - NOTE the mismatch on the request element attribute compared to response -->
<wsdl:message name="myOperationRequest">
   <wsdl:part element="tns:myOperation" name="request"/>
</wsdl:message>
<wsdl:message name="myOperationResponse">
   <wsdl:part element="tns:myOperationResponse" name="response"/>
</wsdl:message>

<!- operations -->
<wsdl:portType name="MyService">
   <wsdl:operation name="myOperation">
      <wsdl:input message="tns:myOperationRequest"/>
      <wsdl:output message="tns:myOperationResponse"/>
      <wsdl:fault message="tns:myOperationFault" name="myOperationFault"/>
      <wsdl:fault message="tns:myOperationFault1" name="myOperationFault1"/>
   </wsdl:operation>
</wsdl:portType>

更新 2:我将导入的命名空间中的所有类型(它们位于单独的 xsd 中)提取到 wsdl 中,因为我怀疑导入可能会触发消息契约生成。令我惊讶的是,事实并非如此,并且在 wsdl 中定义所有类型并没有改变任何内容。

然后,我(出于绝望)开始从头开始构建 wsdls,并使用序列属性中包含的元素属性的 maxOccurs 属性,我能够重现不需要的消息契约生成行为。

这是元素的示例:

<xsd:element name="myElement">
   <xsd:complexType>
      <xsd:sequence>
         <xsd:element minOccurs="0" maxOccurs="1" name="arg1" type="xsd:string"/>
      </xsd:sequence>
   </xsd:complexType>
</xsd:element>

在用作消息的元素(基本上所有请求和响应)上使用 maxOccurs 会发生以下情况:

  • maxOccurs = "1"不触发换行
  • macOcccurs > 1 触发换行
  • maxOccurs = "unbounded"触发环绕

我还无法在我的生产 wsdl 上重现这一点,因为类型的嵌套非常深,我需要时间来彻底检查它。与此同时,我希望它能敲响警钟 - 任何帮助都将受到高度赞赏。

最佳答案

我也遇到了同样的问题,这解决了它。

我用的是这个:

    <wsdl:message name="Method">
      <wsdl:part name="parameters" element="s0:Method"/>
    </wsdl:message>

    <wsdl:message name="MethodResponse">
      <wsdl:part name="parameters" element="s0:MethodResponse"/>
    </wsdl:message>

而不是:

    <wsdl:message name="Method">
      <wsdl:part name="request" element="s0:Method"/>
    </wsdl:message>

    <wsdl:message name="MethodResponse">
      <wsdl:part name="response" element="s0:MethodResponse"/>
    </wsdl:message>

我相信之前有人提到过,但我还不能投票他们的答案!

关于wcf - 添加服务引用正在生成消息契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375446/

相关文章:

c++ - 如何在 VS 2008 中创建 C++ 库?

visual-studio-2008 - 在哪里可以找到有关编写与 Visual Studio 集成的版本控制系统的信息?

c# - TLS 致命 : Handshake Failure

wcf - 学习 WCF 的最佳方法是什么?

WCF应用程序启动事件

wcf - 如何更改 WCF 服务引用的地址?

java - 为 servlet Jersey REST 服务错误分配异常

c# - ASP.NET Web 服务中的安全性,只允许特定的人使用它

web-services - 如何从 Ant 脚本或 Jenkins 内部调用 Web 服务?

visual-studio-2008 - 在 VS2008 中禁用 XAML 编辑器中的智能感知?