2011-12-07 8 views
2

SOや他の場所で調べましたが、私の中ではまだわかりません。場合。4つの入力パラメータと3つの出力パラメータを持つWCFサービスは、プロキシクラスプロジェクトのサービス参照の追加によって並べ替えられます。

私が持っている私の作業VStudio 2010ソリューションのリファクタリングだ:プロキシクラスの別の独立したプロジェクト(によって生成されたものを除き、ここにはコードがWebを追加ASMXのWebサービス

    • 一つのプロジェクトをクライアントのための別の独立したプロジェクトは、( ProxyClass.dll
    への参照が含まれてい
  • を参照0

    新しいVStudio 2010ソリューションを持っている:

    • 1単独では契約の種類WCFサービスライブラリのプロジェクト(IFileService.cs)契約の実装のための型のWCFサービスライブラリの 一つのプロジェクト(FileService.cs
    • プロキシクラスの別の独立したプロジェクト(によって生成されたものを除き、ここにいないコードは、クライアントのための別の独立したプロジェクトは、(WCFProxへの参照が含まれているサービス参照
    • を追加します。 yClass.dll)

    ここでは)パラメータ(およびその実装うち3で終わる契約が同じ順序である:ここでは

    [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); 
    } 
    

    私は「あなたがサービス参照の追加]を使用すべきではありませんが、代わりにsvcutil.exeを使用」に「あなたはWCFでPARMSを使用することはできません」「パラメータの順序は重要ではありませんするに至るまでの回答を読んだことがあります...そうなる まだ仕事 "。

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

  • +0

    参照を使用してサービスを呼び出すとどうなりますか? – Maess

    答えて

    2

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

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

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

    +1

    ありがとうございます。 ASMX WebサービスをWCFを使って同じものに書き直すことを私は続けます。 –

    関連する問題