1

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を変更する方法を教えてください。それは、それを回答済みとしてマークするための重要な部分です。

WCF:アクション、アスタリスク、メタデータ

メタデータ発行に使用されるWsdlExporterは、アスタリスクアクション(ActionとReplyActionの両方)を使用した操作を無視します。

MSDNから-ReplyActionプロパティ

サービスでアスタリスクを指定すると、メッセージに応答アクションを追加しないようにWCFに指示されます。これは、メッセージに対して直接プログラミングしている場合に役立ちます。

参考文献

  1. 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>
4

2 に答える 2

6

私はそれを考え出した。他の人のために、ここで説明します。

その前に、いくつかのデバッグのアイデアについて、 400 Bad Request Exception:Simple SOAP WCF service withsmalldataへの回答を参照してください。

これはツールFormat SOAP Actionのオプションによるものです。WCSF Blue

WCSF Blueを使用してコードを生成するときに、「FormatSoapActions」を使用しました。しかし、クライアントの間、私はツールを使用しませんでした。その不一致が重要な問題です。

Format Soap Actionsは、各操作コントラクトに適用されるSOAPアクション(ActionおよびReplyAction )を標準のWCF形式に強制します。

  <namespace>/<service>/<operation>[Response] 

クライアントを制御できない場合は、WCSFBlueToolで[SOAPアクションのフォーマット]オプションを使用しないでください。

動作例については、サービスはwcfTestClientから機能しますが、コンソールアプリケーションで失敗することを参照してください。

[それでも質問があります-クライアントを制御できない場合でも、ReplyActionを使用する必要がありますか?クライアントとサービスで使用されるこのようなシナリオでのxml形式のURIは何になりますか?]

一般的なデバッグのアイデア:

  1. wcfTestClientを使用してサービスが良好であることを確認します(起動するにはVSコマンドプロンプトにwcfTestClientと入力します)

  2. WCFトレースをオンにする方法で説明されているようにトレースを使用しますか?

  3. 構成値がoutput.configではなくweb.config/app.configにあることを確認します(ツールを使用した自動生成の場合)

  4. 適切なwsdlを参照していることを確認します(実行中のサービスからのローカルファイルまたはURLですか?)

  5. svcファイルを参照して、wsdlを表示できることを確認します。メタデータが有効になっている

  6. サービスの「アドレス」の相対パスか絶対パスかを確認してください

于 2012-09-14T13:32:54.187 に答える
2

ReplyActionに問題があるのは正しいです。ReplyActionが"*"に設定されている場合、WCFはその操作を無視します。オペレーションコントラクトへのReplyActionを修正すると機能します。

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/41f5fe72-3ab3-4741-867e-a93119fe62aa

于 2012-09-14T09:15:59.593 に答える