2016-04-11 13 views
0

WCFサービス(NetTcpBinding)と片方向通信を作成しようとしていますが、動作していないようです。NetTcpBindingを使用したOneWay通信C#

インタフェース:

[ServiceKnownType(typeof(ProcessParameter))] 
[ServiceKnownType(typeof(string))] 
[ServiceContract] 
public interface IExecServiceHost 
{ 
    [OperationContract(IsOneWay = true)] 
    void ExecBPWithPP(ISysObject _caller, UserEntity _currentUser, string _bpName, IProcessParameter _parameter, string _afterBP); 
    [OperationContract(IsOneWay = true)] 
    void ExecBPWithNVC(ISysObject _caller, UserEntity _currentUser, string _bpName, Dictionary<string, string> _parameter, string _afterBP); 
} 

サービス:

Uri[] serviceURL = new Uri[] { new Uri(ExecBPEndPointURL) }; 
ServiceHost host; 

host = new ServiceHost(typeof(ExecServiceHost), serviceURL); 
host.AddServiceEndpoint(typeof(IExecServiceHost), new NetTcpBinding(), "ExecBP"); 
host.Open(); 
Console.ReadKey(); 
host.Close(); 

クライアント:

using(ChannelFactory<IExecServiceHost> httpFactory = new ChannelFactory<IExecServiceHost>(
    new NetTcpBinding(), 
    new EndpointAddress(ExecBPEndPointURL))) 
{ 
    IExecServiceHost httpProxy = httpFactory.CreateChannel(); 

    Dictionary<string, string> serviceBPParam = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); 

    foreach(string key in _parameter.Keys) 
     serviceBPParam.Add(key, _parameter[key]); 

    httpProxy.ExecBPWithNVC(_caller, _currentUser, _bpName, serviceBPParam, _afterBP); 
    httpFactory.Close(); 
} 

私はそれが処理完了まで待つASP.netページからWCFクライアントを呼び出しています。私が逃しているものを手伝ってください。 また、これまでのところ、サービス/エンドポイントには設定を使用していません。

通信のwcfクライアントは、wcfサーバーが実行を完了するのを待つことは想定されていません。これが主な問題です。

+0

エラーメッセージなどありますか? –

+0

トム、それは誤りではない。しかし、wcfクライアントは、isOneWay = trueのときに待つべきではありません。しかし、上記のコードでは、wcfクライアントはwcfサーバーが応答するまで待っています。 –

答えて

1

非同期呼び出しで片方向の呼び出しを混乱させます。

Asyncでは、クライアントが呼び出しを行いますが、制御はすぐに戻り、応答はコールバックを介して処理されます。スレッドは応答を待つことはありません。これは私が思うと思う行動です。

一方向では、サービスはhttp200以外の応答を返しません。これは、コール処理コードを実行した結果、内部状態の変化に関係なく行われます。しかし、クライアントは200を受信するまでブロックされますが、負荷がかかりすぎると時間がかかります。

さらに、接続に失敗するとクライアントチャネルにも障害が発生するため、一方向であってもクライアントでこのような種類の障害を処理する必要があります。

多くのためのhereを参照してください。

いくつかの一方向のアプリケーションは、すぐにアウトバウンドデータは いくつかのシナリオの実装では、ネットワーク接続に書き込まれると を返しながら、ということを理解することは重要ですWCFクライアントが一方向操作を使用してブロックされるようにすることができます。 WCFクライアント アプリケーションでは、アウトバウンド データがネットワーク接続に書き込まれるまで、WCFクライアントオブジェクトは返されません。これは、片方向操作を含むすべての メッセージ交換パターンに当てはまります。つまり、トランスポートにデータを書き込む際に問題が発生すると、クライアント は返されません。問題によっては、 の例外またはサービスへのメッセージの送信が遅れることがあります。

+0

さて、非同期を試してみましょう。私はあなたがそれを実装すると、私はあなたを更新します。 –

関連する問題