0

次のようなWCFホストがあります。

[ServiceContract]
public interface IMountToOs
{
    [OperationContract]
    char GetMountDriveLetter();

    [OperationContract]
    MyTestClass MyTest();
}

public class MyTestClass
{
    public string A { get; set; }
    public string B { get; set; }
}

クライアント

    private IMountToOs _proxy;
    public IMountToOs Proxy
    {
        get
        {
            if (_proxy == null)
            {
                NetTcpBinding binding = new NetTcpBinding();
                binding.MaxReceivedMessageSize = 2147483647;
                binding.OpenTimeout = TimeSpan.FromMilliseconds(50000);
                EndpointAddress address = new EndpointAddress("net.tcp://localhost:1234/MountToOsHost");
                //_proxy = new MountToOsClient(binding, address);
                ChannelFactory<IMountToOs> factory = new ChannelFactory<IMountToOs>(binding);
                _proxy = factory.CreateChannel(address);
            }

            return _proxy;
        }
    }

アクセスできるうちに

    MessageBox.Show("Okay - " + Proxy.GetMountDriveLetter());

このメソッドを呼び出すことはできません:

    MessageBox.Show("Okay - " + Proxy.MyTest().A);

完全な拡張機能が機能していません。ただし、拡張機能で使用している間のみ。拡張子の1行目にメッセージボックスを挿入してもヒットしません。どうしてか分かりません。事前チェックを実行して、拒否されたカスタムクラスの呼び出しを見つけるようです... winformなどを使用すれば問題ありません。

.net 3.5

興味深いのは、ブレークポイントとホスト側のメッセージがあることです。したがって、メソッドが呼び出されていないことがわかります

今すぐ更新して、拡張機能の Load メソッドで wcf-call を移動し、例外を取得しました。

System.MissingMethodException: メソッドが見つかりません: "Contracts.Interfaces.MyTestClass Contracts.Interfaces.IMountToOs.MyTest()".

私のwinformテストとこの拡張機能は同じインターフェースを使用するため、メソッドは両方から認識されるはずです。契約がないか、時代遅れです

4

2 に答える 2

0

ここと投稿のコメントによると、「クライアントチャネルファクトリメソッドを使用して動的サービスプロキシを作成するには、サービスのデータコントラクトが必要です。データコントラクトがなくてもサービスURLがある場合は、リフレクションを使用して実行時にプロキシを作成し、サービスメソッドを呼び出すことができます。」

MyTestClassタイプはクライアント側では認識されていないようです。したがって、リフレクションを使用するか、クライアントとサーバー間でクラスを共有するか、もっと簡単にdatacontract属性を使用することができると思います。

また、MSDNで次のようなものを見つけました。

いつプロキシを使用するのですか?

svcutil.exeを使用してプロキシを作成します。このツールの出力はプロキシクラスを提供し、アプリケーション構成ファイルに対応する変更を加えます。複数のアプリケーションで使用されることがわかっているサービス、または複数の場所で使用できるほど汎用的なサービスがある場合は、生成されたプロキシクラスを引き続き使用することをお勧めします。WCFでプロキシを使用して、サービス契約とエンティティをクライアントと共有できるようにします。プロキシには、取得と設定が必要、コンストラクターを公開できない、サービスコントラクト以外のメソッドを公開できない、コードの繰り返し、サービスコントラクト/データコントラクト/メッセージコントラクトを追加/変更するたびに、いくつかの制限があります。クライアントのプロキシを再生成する必要があります。

ChannelFactoryを使用する場合

もう1つのオプションは、ChannelFactoryクラスを使用して、プロキシを必要とせずにクライアントとサービスの間にチャネルを構築することです。場合によっては、クライアントアプリケーションに緊密にバインドされたサービスがある場合があります。このような場合、インターフェイスDLLを直接参照し、ChannelFactoryを使用してそれを使用してメソッドを呼び出すことは理にかなっています。ChannelFactoryルートの重要な利点の1つは、svcutil.exeを使用した場合に他の方法では利用できないメソッドにアクセスできることです。

ChannelFactoryとProxyクラスをいつ使用するのですか?

DLLは、クライアントコードが管理下にあり、サービスコントラクトだけでなく、エンティティに関連付けられたユーティリティメソッドなどをクライアントと共有して、クライアントとサービスコードをより緊密にバインドしたい場合に役立ちます。エンティティがあまり変更されず、クライアントコードが少ないことがわかっている場合、DLLはプロキシよりもうまく機能します。サービスのクライアントがAPIなどのシステムの外部にある場合は、DLLではなくコードファイルを提供することでコントラクトの共有が容易になるため、プロキシを使用するのが理にかなっています。」

于 2012-08-23T08:21:19.687 に答える
0

クラス MountToOsClient: IMountToOs が表示されないため、これで問題ないとしか考えられません。

[DataContract] // Missing
public class MyTestClass 
{ 
    [DataMember] // Missing
    public string A { get; set; } 
    [DataMember] // Missing
    public string B { get; set; } 
} 

MountToOsClient は、これらの属性がないと Mytestclass を公開できません。

于 2012-08-22T15:42:35.337 に答える