2010-01-30 11 views
7

Ok, cela me rend fou. J'ai essayé de construire le code de mise en œuvre de services d'un wsdl prédéfini et il est toujours retournais un message sur le contrat de service/Interface:Générer du code à partir de WSDL dans WCF ne cesse de renvoyer le message ne correspond pas à la valeur par défaut

// CODEGEN: Generating message contract since the wrapper name (GetMetricsRequest) of message GetMetricsRequest does not match the default value (GetMetrics) 

    [System.ServiceModel.OperationContractAttribute(Action="GetMetrics", ReplyAction="*")] 
    [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)] 
    GetMetricsResponse GetMetrics(GetMetricsRequest request); 

J'ai essayé de le faire en utilisant svcutil.exe et service Générer FUACE Assistant de code, et les deux retournent le même résultat.

Ci-dessous le WSDL que j'utilise. J'ai ajouté les types ici, je les ai éclatés dans un xsd séparé, je ne voulais pas poster les deux. L'utilisation de ce fichier wsdl (avec tous les types incorporés) génère également les mêmes problèmes.

J'ai passé en revue cet article de blog (http://pzf.fremantle.org/2007/05/handlign.html), c'est à peu près tout ce que j'ai pu trouver concernant ce problème. Je pense que j'ai fait tout ce qu'il a à dire, mais j'ai toujours des problèmes.

Est-ce que quelqu'un d'autre est tombé dessus? C'est très exaspérant, peut-être qu'il me manque quelque chose d'évident. Toute aide est la bienvenue.

<wsdl:definitions 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:tns="urn:MyNameSpace:V1_0"   


targetNamespace="urn:MyNameSpace:V1_0"> 


<wsdl:types> 
    <xs:schema targetNamespace="urn:MyNameSpace:V1_0"> 
    <xs:element name="GetMetricsRequest"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element nillable="true" name="GetMetricRequestElement" type="tns:GetMetricRequestType"/> 
    </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="GetMetricResponse"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element nillable="true" maxOccurs="unbounded" name="GetMetricResponseElement" type="tns:GetMetricResponseType"/> 
    </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="GetMetricResponseType"> 
    <xs:sequence> 
    <xs:element nillable="true" name="Metrics" type="tns:MetricsType"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="GetMetricRequestType"> 
    <xs:sequence> 
    <xs:element minOccurs="1" maxOccurs="1" name="MetricCriteria" nillable="true" type="tns:MetricCriteriaType"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:simpleType name="AvailableMetricType"> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value="MetricType1"/> 
    <xs:enumeration value="MetricType2"/> 
    <xs:enumeration value="MetricType3"/> 
    <xs:enumeration value="MetricType4"/> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="AvailableMetricsType"> 
    <xs:sequence> 
    <xs:element minOccurs="1" nillable="true" maxOccurs="unbounded" name="MetricType" type="tns:AvailableMetricType"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:simpleType name="MetricDimensionType"> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value="Store"/> 
    <xs:enumeration value="Workgroup"/> 
    <xs:enumeration value="BusinessDate"/> 
    <xs:enumeration value="JobClass"/> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="MetricDimensionsType"> 
    <xs:sequence> 
    <xs:element minOccurs="1" maxOccurs="unbounded" nillable="true" name="MetricDimension" type="tns:MetricDimensionType"/> 
    </xs:sequence> 
    </xs:complexType>  

    <xs:complexType name="MetricCriteriaType"> 
    <xs:sequence> 
    <xs:element minOccurs="0" maxOccurs="1" name="storeNumber" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" maxOccurs="1" name="workgroup" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" maxOccurs="1" name="jobClass" nillable="true" type="xs:string"/> 
    <xs:element maxOccurs="1" nillable="true" name="dateStart" type="xs:dateTime"/> 
    <xs:element maxOccurs="1" nillable="true" name="dateEnd" type="xs:dateTime"/> 
    <xs:element maxOccurs="1" name="dimensions" nillable="true" type="tns:MetricDimensionsType"/> 
    <xs:element maxOccurs="1" name="metricTypes" nillable="true" type="tns:AvailableMetricsType"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="MetricType"> 
    <xs:sequence> 
    <xs:element minOccurs="0" maxOccurs="1" name="businessDate" nillable="true" type="xs:dateTime"/> 
    <xs:element minOccurs="0" maxOccurs="1" name="store" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" maxOccurs="1" name="workgroup" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" maxOccurs="1" name="jobClass" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" maxOccurs="1" name="metricValue" nillable="true" type="xs:decimal"/>  
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="MetricsType"> 
    <xs:sequence> 
    <xs:element minOccurs="0" maxOccurs="unbounded" name="Metric" nillable="true" type="tns:MetricType"/> 
    </xs:sequence> 
    </xs:complexType> 

    </xs:schema> 
</wsdl:types> 

<wsdl:message name="GetMetricsRequestMessage"> 
    <wsdl:part name="parameters" element="tns:GetMetricsRequest"/> 
</wsdl:message> 

<wsdl:message name="GetMetricsResponseMessage"> 
    <wsdl:part name="parameters" element="tns:GetMetricResponse"/> 
</wsdl:message> 

<wsdl:portType name="Metric"> 
    <wsdl:operation name="GetMetrics"> 
    <wsdl:input message="tns:GetMetricsRequestMessage"/> 
    <wsdl:output message="tns:GetMetricsResponseMessage"/> 
    </wsdl:operation> 
</wsdl:portType> 

<wsdl:binding name="MetricService" type="tns:Metric"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 
    <wsdl:operation name="GetMetrics"> 
    <soap:operation soapAction="GetMetrics" style="document"/> 
    <wsdl:input> 
    <soap:body use="literal"/>  
    </wsdl:input> 
    <wsdl:output> 
    <soap:body use="literal"/> 
    </wsdl:output> 
    </wsdl:operation> 
</wsdl:binding> 

<wsdl:service name="Metric"> 
    <wsdl:port name="GetMetrics" binding="tns:MetricService"> 
    <soap:address location="http://myurl/myproj/1.0/MyService.svc"/> 
    </wsdl:port> 
</wsdl:service> 

</wsdl:definitions> 

marc_s Merci,

Ok, qui semblaient travailler. C'était juste un "s" manquant dans le type de réponse. DOH!

Maintenant, le code de service semble bien fonctionner, mais lorsque je navigue vers mon service, il n'y a pas de contrat de données/xsd et il n'y a pas d'opérations sur le wsdl.

Il ressemble:

<wsdl:definitions name="MetricServiceImplementation" targetNamespace="http://tempuri.org/"> 
    <wsdl:import namespace="urn:GiantEagle:Services:Systems::Metric:V1_0" location="http://localhost:2814/Services/MetricService.svc?wsdl=wsdl0"/> 
    <wsdl:types/> 
    <wsdl:binding name="BasicHttpBinding_MetricService" type="i0:MetricService"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> 
    </wsdl:binding> 
    <wsdl:service name="MetricServiceImplementation"> 
    <wsdl:port name="BasicHttpBinding_MetricService" binding="tns:BasicHttpBinding_MetricService"> 
     <soap:address location="http://localhost:2814/Services/MetricService.svc"/> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

j'attendre à ressembler wsdl j'ai produit le code de, non?

+0

Je pense que cela est lié au fait que vous avez affaire à des types complexes – JohnIdol

+0

Quel est le message d'erreur que vous obtenez – RedDeckWins

Répondre

5

Essayez ceci - votre demande et les messages de réponse dans WSDL doivent être

  • le même nom que votre opération pour la demande (« GetMetrics »)
  • le nom de l'opération + « réponse » pour votre réponse ("GetMetricsResponse")

donc, essayez de changer votre WSDL à:

<wsdl:message name="GetMetrics"> 
    <wsdl:part name="parameters" element="tns:GetMetricsRequest"/> 
</wsdl:message> 

<wsdl:message name="GetMetricsResponse"> 
    <wsdl:part name="parameters" element="tns:GetMetricResponse"/> 
</wsdl:message> 

et également mettre à jour votre portType:

<wsdl:portType name="Metric"> 
    <wsdl:operation name="GetMetrics"> 
     <wsdl:input message="tns:GetMetrics"/> 
     <wsdl:output message="tns:GetMetricsResponse"/> 
    </wsdl:operation> 
</wsdl:portType> 

Est-ce que cela aide du tout?

Sinon: essayez de mettre à jour votre <xs:element> réel dans votre XSD pour correspondre au même modèle - le type de demande doit être le même que l'opération que vous appelez, l'objet de réponse doit être (NomMéthode) Réponse.

+1

maintenant le code de service semble produire de fines , mais quand je navigue vers mon service il n'y a pas de contrat de données/xsd et il n'y a pas d'opérations sur le wsdl. – Brutus35

3

Retirez le "*" dans le ReplyAction("*") du OperationContract

+0

Il ne semble pas y avoir de 'retirer de son ReplyAction dans la première section de code. – JoshDM