2012-10-10 29 views
12

estoy aprendiendo WCF, específicamente estoy aprendiendo a ellos escribir primer contrato, ala wscf.blue¿Por qué obtengo ActionNotSupportedException para mi cliente/servicio WCF?

puedo crear un cliente/servicio WCF contrato última forma (Microsoft) puedo crear un cliente/servicio WCF el primer contrato (WSCF)

Pero, si creo un contrato de primer servicio, intente agregarlo de la manera de Microsoft (Referencia de servicio) en lugar de la forma WSCF.blue (compartir contrato y generar cliente) no funciona t trabajo.

lanza una ActionNotSupportedException con el mensaje 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).

Y no tengo idea de lo que eso significa.

Aquí está mi contrato de prueba:

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> 

Aquí está la sección de system.serviceModel para 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> 

Si agrego una referencia de servicio a http://localhost:50862/Simple.svc Cada parece generar OK m.

creo esto en el app.config cliente usando el editor de configuración del servicio mediante la importación el 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> 

Y si tengo mi código de prueba:

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(); 
} 

Dentro de la TestMethod proxy de la línea siguiente:

return base.Channel.TestMethod(request); 

Lanza la siguiente excepción

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) 

¿Alguien puede ayudar?

Gracias,

J.

Primera Edición

OK, he encontrado ahora que hay algo que va mal con mi WSDL envuelta-doc-iluminado y los generadores de código. A wscf.blue no le gusta que sus mensajes tengan tipos anulables marcados como nillable. Se sale del modo envuelto y las implementaciones del método no se desenvuelven.

Pero, si no los marque como nillable, el código del cliente se saldrá del modo de envoltura porque son tipos anulables no marcados como nillable.

Con tipos anulables marcado no anulable:

lado del servidor:

[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); 

del lado del cliente:

// 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 tipos anulables marcado como nillable:

lado del servidor:

// 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); 

lado del cliente:

[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); 

Sin embargo no tengo ni idea de si esa es la causa, por no hablar de cómo solucionarlo. Dicho esto, I do sepa que los tipos que aceptan nulos deben marcarse como nillable para doc-lit-wrapped wsdl.

Respuesta

1

Creo que el problema es el contrato. En el cliente generado, puede ver contract = "SI.SimpleInterface", pero en la definición de servicio contract = "ISimple".

Cuestiones relacionadas