【问题标题】:generate wcf server code from wsdl files从 wsdl 文件生成 wcf 服务器代码
【发布时间】:2010-08-12 11:48:10
【问题描述】:

您好,我想根据 wsdl 文件生成一些合同。我使用了 svcutil,但我怀疑它生成错误,因为所有合同方法都有 void 返回类型。是否有任何工具可用于此目的?

编辑: 这是 wsdl 文件:

    <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:tns="http://dantek.com.pl/EDItEUR/EDItX/LibraryBookSupply/WebService/CustomerService/20100611/ServiceContract" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" targetNamespace="http://mytargetNamespace/ServiceContract" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <xsd:schema targetNamespace="http://mytargetNamespace/ServiceContract/Imports">
      <xsd:import namespace="http http://mytargetNamespace/ServiceContract/ServiceContract" />
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="CustomerService_ProcessMethod_InputMessage">
    <wsdl:part name="parameters" element="tns:ProcessMethod" />
  </wsdl:message>
  <wsdl:message name="CustomerService_ProcessMethod_OutputMessage">
    <wsdl:part name="parameters" element="tns:ProcessMethodResponse" />
  </wsdl:message>
>
  <wsdl:portType name="CustomerService">
    <wsdl:operation name="ProcessShipNotice">
      <wsdl:input wsaw:Action=" http://mytargetNamespace/ServiceContract/ProcessMethod" message="tns:CustomerService_ProcessMethod_InputMessage" />
      <wsdl:output wsaw:Action=" http://mytargetNamespace/ServiceContract/ProcessMethod" message="tns:CustomerService_ProcessMethod_OutputMessage" />
    </wsdl:operation>
  </wsdl:portType>
</wsdl:definitions>

合约创建

[ServiceContract]
public interface CustomerService
{

    [System.ServiceModel.OperationContractAttribute(Action = "http://mytargetNamespace/ServiceContract/CustomerService/ProcessMethod”, ReplyAction = " http://mytargetNamespace/ServiceContract/CustomerService/ProcessMethodResponse")]
    [System.ServiceModel.XmlSerializerFormatAttribute()]
    void ProcessMethod(ProcessMethodRequest request);

我不想让 ProcessMethod 返回类型 void 而是返回 ProcessMethodResponse 类型。我怎样才能实现它?

EDIT2:这是我的架构:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://myTargetNamespece/ServiceContract" elementFormDefault="qualified" 
     targetNamespace="http://myTargetNamespace/ServiceContract" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="ProcessMethod">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="1" name="request" type="tns:ProcessMethodRequest" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="ProcessMethodRequest" abstract="true" />
  <xs:complexType name="ProcessMethodRequestWithPayload"/>
  <xs:element name="ProcessMethodResponse">
    <xs:complexType />
  </xs:element>
</xs:schema>

【问题讨论】:

  • 不,svcutil 将是适合这项工作的工具。您需要更具体地了解您的问题,我猜...您能向我们展示 WSDL 的一部分以及从中生成的代码吗??
  • 好的,您的数据类型似乎是在其他地方定义的 - 某处必须有一个 XSD 文件,其中包含 http://mytargetNamespace/ServiceContract/ServiceContract 命名空间中的对象。您是否将其包含在对 svcutil 的调用中??
  • 是的,我已经包含在我对 svcutil 的调用中

标签: wcf servicecontract


【解决方案1】:

生成的操作契约是正确的。您的 WSDL 使用空响应指定请求/响应操作(= 双向)。 ProcessMethodResponse 元素是响应消息的包装元素,但它不包含任何子元素 = void response。

如果你想返回 ProcessMethodResponse 你必须使用消息契约。您可以通过 /mc 或 /messageContract 开关指示 svcutil 使用消息协定。

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多