Ein WCF-Dienst - zwei Clients; Ein Client funktioniert nicht

Ich habe einen WCF-Dienst und zwei Konsolen-App-Clients.

Service: Der Service-Code wird mit dem WCSF Blue-Tool aus einem WSDL-Kontakt erstellt.

Client 1: Dieser Client verwendet WSDL, das durch Durchsuchen der SVC-Datei abgerufen wird. Diese durchsuchte wsdl-Datei unterscheidet sich geringfügig von der Vertrags-wsdl-Datei.

Client 2: Dieser Client wird mit dem ursprünglichen WSDL-Vertrag erstellt.

Cleint1 funktioniert gut. Client 2 funktioniert nicht. Was alles könnte ein potenzielles Problem sein?

Die App.Config-Datei beider Clients sieht ähnlich aus - nur der Name ändert sich. Ich denke, das Problem wird im Client-C # -Code generiert - höchstwahrscheinlich imAktionReplyAction. Was muss hier korrigiert werden?

Ein spürbarer Unterschied besteht in Action und ReplyAction

Kunde 1:

Action = "urne: lijo: demos: multiplyservice: berechnung: v1 / ICalculationService / GetMultiplied", ReplyAction = "urne: lijo: demos: multiplyservice: berechnung: v1 / ICalculationService / GetMultipliedRe" + "sponse"

Kunde 2:

Action = "urn: lijo: demos: multiplyservice: berechnung: v1: getMultipliedIn", ReplyAction = "*"

Trace-Nachricht

Die Nachricht mit der Aktion 'urn: lijo: demos: multiplyservice: berechnung: v1: getMultipliedIn' kann auf dem Empfänger aufgrund einer Nichtübereinstimmung mit ContractFilter am EndpointDispatcher nicht verarbeitet werden. Dies kann entweder auf eine Vertragsinkongruenz (inkongruente Aktionen zwischen Absender und Empfänger) oder auf eine Bindungs- / Sicherheitsinkongruenz zwischen Absender und Empfänger zurückzuführen sein. Stellen Sie sicher, dass Absender und Empfänger denselben Vertrag und dieselbe Bindung haben (einschließlich Sicherheitsanforderungen, z. B. Nachricht, Transport, Keine).

BEARBEITEN

Dies kann korrigiert werden, indem Sie die Aktion und ReplyAction wie folgt ändern (vom Dienst kopiert).

  [System.ServiceModel.OperationContractAttribute(Action = "urn:lijo:demos:multiplyservice:calculation:v1/ICalculationService/getMultiplied", ReplyAction = "urn:lijo:demos:multiplyservice:calculation:v1/ICalculationService/getMultipliedRe" +
        "sponse")]

Hinweis: Es ist wichtig sicherzustellen, dass das Gehäuse im Dienst korrekt ist (d. H. GetMultiplied nicht GetMultiplied).

Kopieren aus dem Dienst ist keine gute Option, obwohl es funktioniert. Was wäre die richtige Aktion und ReplyAction?

Können Sie bitte auch darauf hinweisen, wie es geht?Ändern Sie die WSDL so, dass die ReplyAction korrekt ist im generierten Client-Proxy? Das ist der wesentliche Teil, um es als beantwortet zu markieren.

WCF: Aktionen, Sternchen und Metadaten

WsdlExporter, der für die Veröffentlichung von Metadaten verwendet wird, ignoriert Vorgänge mit Sternchenaktionen (sowohl Action als auch ReplyAction).

VonMSDN -ReplyAction-Eigenschaft

Durch die Angabe eines Sterns im Dienst wird WCF angewiesen, der Nachricht keine Antwortaktion hinzuzufügen. Dies ist hilfreich, wenn Sie direkt mit Nachrichten programmieren.

VERWEISE:

Fehlende WCF-Metadatenoperationen

RestaurantData.xsd

 <?xml version="1.0" encoding="utf-8" ?>
 <xs:schema id="RestaurantData" targetNamespace="urn:lijo:demos:multiplyservice:data:v1"
    elementFormDefault="qualified" xmlns="urn:lijo:demos:multiplyservice:data:v1"
    xmlns:mstns="urn:lijo:demos:multiplyservice:data:v1" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="multipliedResult">
  <xs:sequence>
  <xs:element name="resultNumber" type="xs:int" />
   </xs:sequence>
   </xs:complexType>

  </xs:schema>

Originalvertrag wsdl

 <definitions xmlns:import0="urn:lijo:demos:multiplyservice:messages:v1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:import1="urn:lijo:demos:multiplyservice:data:v1" xmlns:tns="urn:lijo:demos:multiplyservice:calculation:v1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" name="CalculationService" targetNamespace="urn:lijo:demos:multiplyservice:calculation:v1" xmlns="http://schemas.xmlsoap.org/wsdl/">

 <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" />
 <types>
 <xsd:schema>
  <xsd:import schemaLocation="C:\toolbox\LijosServiceApp\NewService\RestaurantMessages.xsd" namespace="urn:lijo:demos:multiplyservice:messages:v1" />
  <xsd:import schemaLocation="C:\toolbox\LijosServiceApp\NewService\RestaurantData.xsd" namespace="urn:lijo:demos:multiplyservice:data:v1" />
</xsd:schema>
</types>
<message name="getMultipliedIn">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" />
<part name="parameters" element="import0:getMultiplied" />
</message>
<message name="getMultipliedOut">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" />
<part name="parameters" element="import0:getMultipliedResponse" />
</message>
<portType name="CalculationServiceInterface">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" />
<operation name="getMultiplied">
  <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" />
  <input message="tns:getMultipliedIn" />
  <output message="tns:getMultipliedOut" />
</operation>
</portType>
<binding name="BasicHttpBinding_CalculationServiceInterface" type="tns:CalculationServiceInterface">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="getMultiplied">
  <soap:operation soapAction="urn:lijo:demos:multiplyservice:calculation:v1:getMultipliedIn" style="document" />
  <input>
    <soap:body use="literal" />
  </input>
  <output>
    <soap:body use="literal" />
  </output>
 </operation>
 </binding>
 <service name="CalculationServicePort">
 <port name="CalculationServicePort" binding="tns:BasicHttpBinding_CalculationServiceInterface">
  <soap:address location="http://localhost/CalculationService" />
 </port>
 </service>
 </definitions>

Antworten auf die Frage(2)

Ihre Antwort auf die Frage