添加服务引用正在生成消息合同

时间:2010-03-03 22:19:58

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

当我在Visual Studio 2008(SP1)上使用“添加服务引用”导入给定服务时,所有请求/响应消息都被不必要地包装到消息合同中(命名为 - >“operationName”+“Request”/ “回应”+“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中定义的所有类型都没有改变任何内容。

然后我(出于绝望)开始从头开始构建wsdl并使用序列属性中包含的元素属性的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&gt; 1 触发包装
  • maxOccurs =“unbounded”触发包装

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

5 个答案:

答案 0 :(得分:5)

我有同样的问题,这解决了它。

我用过这个:

    <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>

我相信有人之前曾提到它,但我还不能回答他们的答案!

答案 1 :(得分:4)

这是另一个要检查的项目:

  1. 在解决方案资源管理器中右键单击您的服务引用,然后选择“配置服务引用”

  2. 检查是否选中“始终生成邮件合同”。

答案 2 :(得分:4)

您是否尝试过更改WSDL,以便对于part element =“tns:myOperation”name =“request”的每个实例,将name属性的值更改为'parameters'。

答案 3 :(得分:2)

虽然我知道这是一个漫长的过时条目,对于那些偶然发现同样问题的人:

仔细检查生成的代理是否包含任何锯齿状数组,例如

(C#)

private string[][] mystring;

(VB.NET)

Private myString()() As String

答案 4 :(得分:1)

您是否尝试过使用scvutil? 转到 - &gt; Startmenu / Visual Studio 2008 / Tools / VS命令提示符

输入svcutil,然后检查参数,尤其是/ wrapped参数。最终使用它来生成你的代理,它可以让你更多地控制最新进展