2012-10-10 22 views
12

Sto imparando WCF, in particolare sto imparando a scrivere loro primo contratto, ala wscf.bluePerché ottengo ActionNotSupportedException per il mio client/servizio WCF?

posso creare un client/servizio WCF contratto ultimo modo (Microsoft) posso creare un client/servizio WCF il primo modo di contratto (WSCF)

Ma, se creo un contratto per primo servizio, quindi provo ad aggiungerlo al modo Microsoft (riferimento di servizio) invece del modo WSCF.blue (condividi il contratto e genera client) non lo fa lavoro.

viene generata ActionNotSupportedException con il messaggio The message with Action 'urn:test-com:simple:testMethodIn' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).

E non ho idea di che cosa ciò significhi.

Ecco il mio contratto di prova:

SimpleModel.xsd

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns="urn:test-com:simple" xmlns:mstns="urn:test-com:simple" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:test-com:simple" elementFormDefault="qualified" attributeFormDefault="unqualified" id="SimpleModel"> 
    <xs:complexType name="PayloadType"> 
     <xs:sequence> 
      <xs:element name="AString" type="xs:string" nillable="1" minOccurs="0"/> 
      <xs:element name="AnInt" type="xs:int"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

SimpleMessages.xsd

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns="urn:test-com:simple" xmlns:mstns="urn:test-com:simple" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:smod="http://tempuri.org/SimpleModel.xsd" targetNamespace="urn:test-com:simple" elementFormDefault="qualified" attributeFormDefault="unqualified" id="SimpleMessages"> 
    <xs:include schemaLocation="SimpleModel.xsd"/> 
    <xs:element name="TestMethod"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="APayload" type="PayloadType" minOccurs="0"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="TestMethodResponse"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Output" type="PayloadType"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Simple.wsdl

<!--WSDL generated by thinktecture WSCF; version 1.0.13.0--> 
<!--Tuesday, 09-10-2012 - 02:41 PM--> 
<definitions xmlns:tns="urn:test-com:simple" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" name="Simple" targetNamespace="urn:test-com:simple"> 
    <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 
    <types> 
     <xsd:schema> 
      <xsd:import schemaLocation="SimpleMessages.xsd" namespace="urn:test-com:simple"/> 
     </xsd:schema> 
    </types> 
    <message name="testMethodIn"> 
     <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 
     <part name="parameters" element="tns:TestMethod"/> 
    </message> 
    <message name="testMethodOut"> 
     <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 
     <part name="parameters" element="tns:TestMethodResponse"/> 
    </message> 
    <portType name="SimpleInterface"> 
     <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 
     <operation name="TestMethod"> 
      <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 
      <input message="tns:testMethodIn"/> 
      <output message="tns:testMethodOut"/> 
     </operation> 
    </portType> 
    <binding name="BasicHttpBinding_SimpleInterface" type="tns:SimpleInterface"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> 
     <operation name="TestMethod"> 
      <soap:operation soapAction="urn:test-com:simple:testMethodIn" style="document"/> 
      <input> 
       <soap:body use="literal"/> 
      </input> 
      <output> 
       <soap:body use="literal"/> 
      </output> 
     </operation> 
    </binding> 
    <service name="ISimple"> 
     <port name="NewPort" binding="tns:BasicHttpBinding_SimpleInterface"> 
      <soap:address location="http://localhost:50862/Simple.svc"/> 
     </port> 
    </service> 
</definitions> 

Ecco la sezione system.serviceModel indietro m web.config

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="SimpleServiceBehaviour"> 
       <serviceMetadata externalMetadataLocation="http://localhost:50862/TestContract/Simple.wsdl" httpGetEnabled="true"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <diagnostics> 
     <messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true"/> 
    </diagnostics> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_SimpleInterface" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/> 
       <security mode="None"> 
        <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
        <message clientCredentialType="UserName" algorithmSuite="Default"/> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="SimpleServiceBehaviour" name="SimpleContract.Simple"> 
      <endpoint address="http://localhost:50862/Simple.svc" behaviorConfiguration="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_SimpleInterface" contract="ISimple"/> 
     </service> 
    </services> 
</system.serviceModel> 

Se posso aggiungere un riferimento al servizio di http://localhost:50862/Simple.svc Ogni appare per generare OK.

creo questo nel app.config client utilizzando l'editor del servizio di configurazione importando il web.config:

<system.serviceModel> 
    <client> 
     <endpoint address="http://localhost:50862/Simple.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_SimpleInterface" contract="SI.SimpleInterface" name="NewPort"/> 
    </client> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_SimpleInterface" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/> 
       <security mode="None"> 
        <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
        <message clientCredentialType="UserName" algorithmSuite="Default"/> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
</system.serviceModel> 

E se eseguo il mio codice di prova:

static void Main(string[] args) 
{ 
    SimpleInterfaceClient client = new SimpleInterfaceClient(); 

    var ret = client.TestMethod(new PayloadType() { AnInt = 7, AString = "bob" }); 

    Console.WriteLine(ret.ToString()); 
    Console.ReadLine(); 
} 

All'interno del TestMethod procura la seguente riga:

return base.Channel.TestMethod(request); 

genera la seguente eccezione

System.ServiceModel.ActionNotSupportedException occurred 
    Message="The message with Action 'urn:test-com:simple:testMethodIn' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None)." 
    Source="System.ServiceModel" 
    StackTrace: 
     at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter) 

Qualcuno può aiutare?

Grazie,

J.

Prima Modifica

OK, ora ho scoperto che c'è qualcosa che non va con il mio WSDL doc-lit-avvolto ei generatori di codice. wscf.blue non apprezza che i messaggi abbiano tipi annullabili contrassegnati come nillable. Esce dalla modalità avvolta e le implementazioni del metodo non vengono scartate.

Tuttavia, se non li contrassegno come nillable, il codice client non rientra nella modalità di avvolgimento perché sono tipi nullable non contrassegnati come nillable.

Con tipi nullable segnato non nillable:

lato server:

[System.ServiceModel.OperationContractAttribute(Action="urn:test-com:simple/ISimple/TestMethod", ReplyAction="urn:test-com:simple/ISimple/TestMethodResponse")] 
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)] 
[return: System.ServiceModel.MessageParameterAttribute(Name="Output")] 
PayloadType TestMethod(PayloadType APayload); 

lato client:

// CODEGEN: Generating message contract since element name APayload from namespace urn:test-com:simple is not marked nillable 
[System.ServiceModel.OperationContractAttribute(Action="urn:test-com:simple:testMethodIn", ReplyAction="*")] 
DesktopClientTest_ServiceReference.SI.TestMethodResponse TestMethod(DesktopClientTest_ServiceReference.SI.TestMethodRequest request); 

Con tipi nullable contrassegnati come nillable:

lato server:

// CODEGEN: Parameter 'Output' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'System.Xml.Serialization.XmlElementAttribute'. 
[System.ServiceModel.OperationContractAttribute(Action="urn:test-com:simple/ISimple/TestMethod", ReplyAction="urn:test-com:simple/ISimple/TestMethodResponse")] 
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)] 
[return: System.ServiceModel.MessageParameterAttribute(Name="Output")] 
TestMethodResponse TestMethod(TestMethodRequest request); 

lato client:

[System.ServiceModel.OperationContractAttribute(Action="urn:test-com:simple:testMethodIn", ReplyAction="*")] 
[return: System.ServiceModel.MessageParameterAttribute(Name="Output")] 
DesktopClientTest_ServiceReference.SI.PayloadType TestMethod(DesktopClientTest_ServiceReference.SI.PayloadType APayload); 

Tuttavia non ho idea se questo è la causa, per non parlare di come risolvere il problema. Detto questo, I do sa che i tipi annullabili devono essere contrassegnati come nillable per wsdl con documenti chiusi.

risposta

1

Penso che il problema sia contratto. Nel client generato, è possibile visualizzare contratto = "SI.SimpleInterface", ma in contratto di definizione del servizio = "ISimple".

Problemi correlati