2

私はSOや他の場所を見て、これについて提起された質問と、私の場合はまだ意味をなさないいくつかの回答を見てきました。

次のものを持つ作業中の VStudio 2010 ソリューションをリファクタリングしています。

  • ASMX Web サービスを使用する 1 つのプロジェクト
  • プロキシ クラス用の別のプロジェクト ( Web 参照の追加によって生成されるものを除いて、ここにはコードはありません)
  • クライアント用の別のプロジェクト (ProxyClass.dll への参照を含む)

新しい VStudio 2010 ソリューションには次の機能があります。

  • コントラクト自体のタイプ WCF サービス ライブラリの 1 つのプロジェクト ( IFileService.cs ) コントラクトの実装のためのタイプ WCF サービス ライブラリの 1 つのプロジェクト ( FileService.cs )
  • プロキシ クラス用の別のプロジェクト ( Add Service Referenceによって生成されるものを除いて、ここにはコードはありません)
  • クライアント用の別のプロジェクト (WCFProxyClass.dll への参照を含む)

以下は、3 つの out パラメータで終了するコントラクトです (同じ実装は同じ順序です)。

[ServiceContract(Name = "IFileService", Namespace =  "http://www.cbmiweb.com/TrimWCF/2011/11")]
public interface IFileService
{
    [OperationContract]
        public string DownloadFile(string trimURL
         , string TrimRecordNumber
         , string CallerPC
         , string RequestorID
         , out byte[] docContents
         , out string returnFiletype
         , out string returnFilename)
    {

私のプロキシクラスプロジェクトで生成されたサービス参照の追加は次のとおりです。

public string DownloadFile(
  out byte[] docContents
, out string returnFiletype
, out string returnFilename
, string trimURL
, string TrimRecordNumber
, string CallerPC
, string RequestorID) 
{
    return base.Channel.DownloadFile(out docContents, out returnFiletype, out returnFilename, trimURL, TrimRecordNumber, CallerPC, RequestorID);
}

「WCF で out parms を使用することはできません」から「Add Service Reference を使用するべきではなく、代わりに svcutil.exe を使用する」から「パラメーターの順序は関係ありません...それでも機能します」までの範囲の回答を読みました。

私はここで何をすべきかについて混乱しています (そして、この再配置された順序となぜそれが起こったのか) につながった私が間違ったことをしました)。

4

1 に答える 1

2

まず第一に、あなたは何も悪いことをしていません:)。クライアントとサーバーのメソッドのシグネチャは異なりますが、それらによって生成/消費されるメッセージと同等です。そのプロキシクラスは問題なく使用でき、同様に機能するはずです。

これが発生する理由は別の話です。サービス記述(WSDL)には、(一方向ではない)操作ごとに2つの「メッセージ」があります。1つは入力パラメーター、もう1つは出力パラメーターです。メッセージにはそれぞれ操作の入力と出力が含まれていますが、WSDLにはそれらの順序を示すものはありません。したがって、Add Service Referenceやsvcutilなどのツールがクライアントプロキシを生成している場合、それは単に1つの順序を「選択」します(最初にパラメーターを選択します)が、プロキシがサービスに送信する要求はサーバーが期待するものと互換性があります(また、サーバーからの応答はプロキシによって正しく理解されます)。

パラメータの順序を維持したい場合は、プロキシクラスを自分で作成できます。このために、ChannelFactory<T>クラスを使用するか、から派生した独自のクライアントクラスを作成できますChannelBase<T>。しかし、前に述べたように、実際にそれを行う必要はありません。

于 2011-12-07T18:38:51.420 に答える