6

Mono でクライアント サーバー WCF アプリケーションを構築しようとしているときに、いくつかの問題に遭遇しました。単純な例に簡略化すると、このサービスは一度に 1 つのクライアントしか受け入れないことがわかりました。別のクライアントが接続を試みると、最初のクライアントが切断されるまでハングします。

BasicHttpBinding に変更するだけで解決しますが、二重通信には NetTcpBinding が必要です。また、MS .NET でコンパイルした場合も問題は発生しません。

編集: Mono が私がやろうとしていることをサポートしていないことを疑います (そしてそうしないことを望みます)。私が気づいた限り、Mono コードは通常、そのような場合に NotImplementedExceptions をスローします。Mono v2.6.4 を使用しています

これは、基本的なシナリオでサービスを開く方法です。

public static void Main (string[] args)
{
    var binding = new NetTcpBinding ();
    binding.Security.Mode = SecurityMode.None;
    var address = new Uri ("net.tcp://localhost:8080");
    var host = new ServiceHost (typeof(Hello));
    host.AddServiceEndpoint (typeof(IHello), binding, address);

    ServiceThrottlingBehavior behavior = new ServiceThrottlingBehavior ()
    {
        MaxConcurrentCalls = 100,
        MaxConcurrentSessions = 100,
        MaxConcurrentInstances = 100            
    };
    host.Description.Behaviors.Add (behavior);

    host.Open ();
    Console.ReadLine ();
    host.Close ();

}

クライアント チャネルは次のように取得されます。

var binding = new NetTcpBinding ();
binding.Security.Mode = SecurityMode.None;
var address = new EndpointAddress ("net.tcp://localhost:8080/");
var client = new ChannelFactory<IHello> (binding, address).CreateChannel ();

私の知る限り、これはシンプレックス接続ですよね。

契約は単純です:

[ServiceContract]
public interface IHello
{

    [OperationContract]
    string Greet (string name);
}

サービスの実装には、ServiceModel のタグや属性はありません。

必要に応じて詳細を更新します。

4

2 に答える 2

3

私はこれを少しいじってみましたが、間違いなく Mono のバグのようです。

現在、Mono で実行する WCF アプリケーションを移植しています。私はいくつかの NetTcpBinding で遊んでいましたが、このシナリオ (Mono でホストされたサービス ホストへの複数の接続) は試していませんでした。しかし、今試してみると、2.6 と最新のデイリー パッケージの両方で再現できます。

ただし、.NET では機能します。Mono と .NET の動作の違いは、バグとして分類されます。テスト ケースとともに Bugzilla に記録する必要があります。Mono ニュースリストにも投稿します。

幸運を。

于 2010-05-31T20:50:51.340 に答える
1

間違いなくバグです。正常に動作するバージョンがあったかどうか疑問に思っています...

その進捗状況に興味がある場合は、Novell Bugzillaに投稿しました。

于 2010-06-02T01:41:08.747 に答える