2010-08-12 7 views
1

Приветствую, я хотел бы сгенерировать некоторый контракт на основе wsdl-файла. Я использовал svcutil, но я подозреваю, что это сработало неправильно, поскольку все методы контракта имеют недействительный возвращаемый тип. Есть ли какой-нибудь инструмент для этой цели?генерировать код сервера wcf из файлов wsdl

EDIT: здесь файл 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 возвращаемого типа пустот, а 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> 
+0

Нет, svcutil был бы правильным инструментом для работы. Вы должны быть более конкретными о своих проблемах, я думаю ... вы можете показать нам часть WSDL и код, созданный из него? –

+0

ОК, кажется, что ваши типы данных определены в другом месте - там должен быть файл XSD, содержащий объекты в пространстве имен http: // mytargetNamespace/ServiceContract/ServiceContract. Вы включили это в свой призыв к svcutil ?? –

+0

Да, я включил в свой призыв к svcutil –

ответ

2

Сформирован контракт операция является правильным. WSDL определяет операцию запроса/ответа (= двусторонняя) с пустым ответом. Элемент ProcessMethodResponse является элементом-оболочкой для ответного сообщения, но он не содержит никаких подэлементов = void.

Если вы хотите вернуть ProcessMethodResponse, вам нужно использовать контракты с сообщениями. Вы можете поручить svcutil использовать контракты сообщений с помощью/mc или/messageContract.

Смежные вопросы