1つのWCFサービスと2つのコンソールアプリクライアントがあります。
サービス:サービスコードは、WCSFBlueツールを使用してwsdl連絡先から作成されます。
クライアント1:このクライアントは、svcファイルを参照して取得したwsdlを使用しています。この参照されたwsdlファイルは、コントラクトwsdlファイルとは少し異なります。
クライアント2:このクライアントは、元のwsdlコントラクトを使用して作成されます。
Cleint1は正常に動作しています。クライアント2が機能していません。潜在的な問題は何でしょうか?
両方のクライアントのApp.Configファイルは似ていますが、名前だけが変更されています。問題は、生成されたクライアントC#コード(おそらくアクション– ReplyAction )にあると思います。ここで何を修正する必要がありますか?
顕著な違いの1つは、アクションとReplyActionです。
クライアント1:
Action = "urn:lijo:demos:multiplyservice:calculation:v1 / ICalculationService / GetMultiplied"、ReplyAction = "urn:lijo:demos:multiplyservice:calculation:v1 / ICalculationService / GetMultipliedRe" + "sponse"
クライアント2:
Action = "urn:lijo:demos:multiplyservice:calculation:v1:getMultipliedIn"、ReplyAction = "*"
トレースメッセージ
アクション'urn:lijo:demos:multiplyservice:calculation:v1:getMultipliedIn'のメッセージは、EndpointDispatcherでのContractFilterの不一致により、レシーバーで処理できません。これは、コントラクトの不一致(送信者と受信者の間のアクションの不一致)または送信者と受信者の間のバインディング/セキュリティの不一致が原因である可能性があります。送信者と受信者が同じコントラクトと同じバインディング(メッセージ、トランスポート、なしなどのセキュリティ要件を含む)を持っていることを確認します。
編集
これは、以下のようにActionとReplyActionを変更することで修正できます(サービスからコピー)。
[System.ServiceModel.OperationContractAttribute(Action = "urn:lijo:demos:multiplyservice:calculation:v1/ICalculationService/getMultiplied", ReplyAction = "urn:lijo:demos:multiplyservice:calculation:v1/ICalculationService/getMultipliedRe" +
"sponse")]
注:サービスの大文字と小文字が正しいことを確認することが重要です(つまり、GetMultipliedではなくgetMultiplied)
サービスからのコピーは機能しますが、適切なオプションではありません。正しいアクションとReplyActionは何でしょうか?
また、生成されたクライアントプロキシでReplyActionが正しくなるようにwsdlを変更する方法を教えてください。それは、それを回答済みとしてマークするための重要な部分です。
メタデータ発行に使用されるWsdlExporterは、アスタリスクアクション(ActionとReplyActionの両方)を使用した操作を無視します。
MSDNから-ReplyActionプロパティ
サービスでアスタリスクを指定すると、メッセージに応答アクションを追加しないようにWCFに指示されます。これは、メッセージに対して直接プログラミングしている場合に役立ちます。
参考文献:
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>
元の契約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>