3

wcf サービスの一方向メソッドを作成したいと考えていました。障害メッセージを返したくない場合は、すべて問題ありません。

wsdl および契約ファイルに wscf blue コード ジェネレーターを使用しています。

wsdl 操作要素には、'Input' および 'Fault' 子要素しかありません。サービスを実行すると、一方向通信で障害メッセージを宣言できないという情報が得られました..解決策の1つは、一方向をfalseに設定することです..私がしたことはうまくいきます。エラーが発生した場合、メッセージが表示されます。

ただし、Web サービス/wsdl 作成ルールを破ったのではないかと思っています... wsdl サービス スキーマ ジェネレーターから、一方向通信 (「true」に設定) が作成され、他のプログラミング言語のジェネレーターはおそらく同じことを行うためです。 ...

それで、私がしたことは正しいですか?ジェネレーターがコードを適切に作成できるように wsdl を変更するにはどうすればよいですか?

理論上、一方向の通信でフォルトを使用できない場合、エラーを返すために応答に追加の構造が必要ですか?

ありがとう!

4

3 に答える 3

4

一方向の操作ではクライアントに障害を返すことができないのは事実です。WCFでvoid 一方向ではないサービス操作を生成する場合は、WSDLコントラクトでその操作の空の出力要素を追加する必要があります。

.NETベースのWSDLパーサー(WSCF.bluesvcutilなど)は、対応する<wsdl:operation>要素を持たない要素に対して一方向のサービス操作を生成し<wsdl:output>ます。

たとえば、このWSDL操作は一方向です:

<wsdl:definitions>
    <wsdl:portType>
        ... 
        <wsdl:operation name="Foo">
           <wsdl:input message="tns:FooRequest" />
        </wsdl:operation>
    </wsdl:portType>
</wsdl:definitions>

一方、空の要素(つまり、空のシーケンス<wsdl:output>を含むXSDタイプ)を使用して操作を定義すると、.NETの非一方向メソッドにマップされます。このメソッドには、オプションで障害宣言を含めることができます。void

<wsdl:definitions>
    <wsdl:portType>
        ... 
        <wsdl:operation name="Foo">
           <wsdl:input message="tns:FooRequest" />
           <wsdl:output message="tns:FooResponse" />
           <wsdl:fault message="tns:FooFault" />
        </wsdl:operation>
    </wsdl:portType>
</wsdl:definitions>

ここで、<tns:FooResponse>タイプは単純に次のように定義されます。

<xs:element name="FooResponse">
    <xs:complexType>
        <xs:sequence/>
    </xs:complexType>
</xs:element>
于 2012-03-13T09:11:35.367 に答える
1

WCF では、一方向とは操作に戻り値がなく、クライアントが呼び出しの成功または失敗を気にしないことを意味します。

WCF では、WCF を介して MSMQ を操作するなど、当然一方向の操作がいくつかありますが、操作は通常一方向に設定されます。

したがって、呼び出しステータスを示すために何かを返したい場合、一方向は正しい選択ではありません。代わりに、一方向ではない通常の wcf 操作を使用できます。

片道運用の場合はこちらの記事が参考になりますWCF ONE-WAY

于 2012-03-13T09:01:42.053 に答える
0

あなたは正しいことをしたと思います。どのタイプのクライアント (C#、JAVA、C++、PHP) でも、必要なのはプロキシを作成するための WSDL だけです。他の言語でも機能するはずだと思います。SoapUI (Neutral Soap client) を使用してサービスをテストすることをお勧めします。

于 2012-03-13T09:04:18.500 に答える