0

XMLメッセージをCGIスクリプトに送信するWCFクライアントを作成しようとしています。スクリプトは要求/応答パターンで機能し、XMLメッセージの内容が呼び出すアクションを決定します。

まず、CGIスクリプトが受け入れる定義済みのドキュメントセットを表すサービスコントラクトを作成します。

[ServiceContract]
public interface ICgiService
{
    [OperationContract(Name="request1")]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)]
    ServiceResponse SubmitRequest(Request1 request);

    [OperationContract(Name="request2")]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)]
    ServiceResponse SubmitRequest(Request2 request);

    [OperationContract(Name="request3")]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)]
    ServiceResponse SubmitRequest(Request3 request);
}

このインターフェイスからプロキシクライアントを生成し、CGIスクリプトへのアドレスを使用してエンドポイントを構成し、HTTPトランスポートを使用しました。

要求が行われると、WCFランタイムのデフォルトの動作は、URIを作成するためにエンドポイントアドレスに操作名を追加することhttp://server/script.cgi/request1です。

URIを変更せずにすべてのリクエストがエンドポイントアドレスに送信されるように、この動作を変更するにはどうすればよいhttp://server/script.cgiですか(例)。

4

2 に答える 2

1

サービス操作に URI テンプレートを提供する必要があります。

[WebGet(UriTemplate="/")]

(GET 動詞を使用している場合)、または

[WebInvoke(UriTemplate="/", Method="POST")]

(POST 動詞を使用している場合)。

UriTemplate何でもかまいません。サービスが存在するベース URL に追加されます。GET 操作が必要な場合は、属性を使用します。[WebGet()]それ以外が必要な場合は、[WebInvoke(Method="....")]属性を使用して、必要な動詞を定義します。

MSDN Magazine の記事An Introduction To RESTful Services With WCFを参照して、WCF と REST の優れた概要を確認してください。

于 2010-07-17T06:49:39.143 に答える
0

最終的に、私が達成したかったことは、現時点ではすぐに使用できる WCF では単純ではないように思えます。

アドレッシングを直接制御するために、 を実装しIClientMessageFormatterてヘッダー値を直接設定できますがTo、これは実装するインターフェイスが非常に重く、他の問題を引き起こす可能性があります。

私の問題を解決するために、サービス契約を次のようにリファクタリングしました。

[ServiceContract]
public interface ICgiService
{
    [OperationContract(Name="script.cgi")]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)]
    ServiceResponse SubmitRequest(ServiceRequest request);
}

CGI スクリプトの URL を完全なエンドポイント アドレスとして指定することはできず、スクリプトがリソースである REST サービスとして扱われます。

さらに、ServiceRequestクラスはリクエストの種類ごとに考えられるすべての XML 構造を表す必要があるため、サービス コントラクトを理解するのがはるかに難しくなっています。

おそらく、これは実際の状況により近いものです。さまざまな XML ドキュメントを、1 つの操作「Do Stuff」を提供する 1 つの CGI スクリプトにポストします。

于 2010-07-21T16:44:15.553 に答える