2012-10-10 17 views
12

ich WCF lerne, lerne ich speziell, wie sie Vertrag zunächst zu schreiben, ala wscf.blueWarum erhalte ich ActionNotSupportedException für meinen WCF-Client/-Dienst?

I letzten Weg (Microsoft) einen WCF-Client/Service, den Vertrag erstellen kann ich einen WCF-Client/Service erstellen Der Vertrag erster Weg (WSCF)

Aber, wenn ich einen Vertrag ersten Service erstellen, dann versuchen Sie es den Microsoft-Weg (Service Reference) anstelle der WSCF.blue Weg hinzufügen (Vertrag zu teilen und Client generieren) es nicht ' t arbeiten.

Es wirft ein ActionNotSupportedException mit der Nachricht 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).

Und ich habe keine Ahnung, was das bedeutet.

Hier ist mein Test Vertrag:

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> 

<?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> 

Hier ist der system.serviceModel Abschnitt SimpleMessages.xsd her 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> 

Wenn ich einen Dienstverweis in den http://localhost:50862/Simple.svc Jeder scheint OK zu erzeugen.

Ich schaffe diese im Client app.config den Service-Konfigurationseditor durch die web.config importieren:

<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> 

Und wenn ich betreibe meine Testcode:

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

Innerhalb des Testmethod Proxy die folgende Zeile:

return base.Channel.TestMethod(request); 

wirft die folgende Ausnahme

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) 

Kann jemand helfen?

Danke,

J.

Zuerst bearbeiten

OK, habe fand ich jetzt, dass es etwas falsch läuft mit meinem doc-lit-wrapped Wsdl und den Code-Generatoren ist. wscf.blue mag es nicht, wenn Nachrichten nullbare Typen haben, die als nillable gekennzeichnet sind. Es fällt nicht in den umgebrochenen Modus und die Methodenimplementierungen werden nicht ausgepackt.

Aber, wenn ich sie nicht als nillable markieren, fällt der Client-Code aus dem Umbruchmodus, da sie Nullable-Typen sind, die nicht als nillable gekennzeichnet sind.

Mit Nullable Types markiert nicht nillable:

Server-Seite:

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

Client Side:

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

Mit Nullable-Typen als nillable markiert:

Server-Seite:

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

Client-Seite:

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

aber ich habe keine Ahnung, ob das die Ursache ist, geschweige denn, wie es zu beheben. Das sagte, ich Do wissen, dass NULL-Typen sollten für doc-lit-Wrapped WSDL markiert werden nillable.

Antwort

1

Ich denke, das Problem ist ein Vertrag. In client generated können Sie contract = "SI.SimpleInterface" sehen, aber in service definition contract = "ISimple".