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 のタグや属性はありません。
必要に応じて詳細を更新します。