2011-07-13 10 views
3

私のサービスの一部のメソッドでOneWay属性を定義しましたが、Oneway呼び出しのように動作しません。 My Clientは、通話が完了してサービスから復帰するのを待ちます。私は、Oneway操作は非ブロック操作であり、クライアントは呼び出された関数に何が起こるかを気にしないと仮定しています。それは単にそれを呼び出して忘れてしまいます。それが正しいか?WCF -IsOnewayが片道操作のように動作しない

問題: OperationContract2を呼び出した後、すぐにプロキシを閉じますが、クライアントはエクセッションが完了するまで待機します。

if (((ICommunicationObject)myServices).State == CommunicationState.Opened) 
     { 
     ((ICommunicationObject)myServices).Close(); 
     } 

configsに問題がありますか?

サーバー設定:

<netTcpBinding> 
    <binding name="GoCustomBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="0" maxReceivedMessageSize="2147483647"> 
    </binding> 
    </netTcpBinding> 

サービス契約:

[ServiceContract] 
public interface IMyServices 
{ 
    [OperationContract(IsOneWay = true, Action = "*")] 
    void OPeration1(List<int> someIds); 

    [OperationContract(IsOneWay = true)] 
    void OPeration2(SomeClass p1); 

} 

クライアントプロキシ:documentation for that attributeから

[ServiceContract] 
public interface IMyServices 
{ 
    [OperationContract(IsOneWay = true, Action = "*")] 
    void Operation1(List<int> someIds); 

    [OperationContract(IsOneWay = true)] 
    void Operation2(SomeClass p1); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class ServiceClient : ClientBase<IMyServices>, IMyServices 
{ 
    public void ScheduleOptimization(List<int> someIds) 
    { 
     Channel.Operation1(routeID); 
    } 

    public void Operation1(SomeClass p1) 
    { 
     Channel.Operation2(pasDataMsg); 
    } 
} 

答えて

7

操作が一方向操作であることを指定すると、それだけが意味します。 応答メッセージはありません。 接続ができない、または送信メッセージが非常に大きい場合、または サービスがインバウンド情報を十分に高速に読み取れない場合は、ブロックすることができます。クライアント に非ブロッキング呼び出しが必要な場合は、AsyncPattern操作を生成します。 詳細については、 クライアントを使用した一方向サービスとサービスの使用を参照してください。

いずれかの問題がありますか?

+0

ConcurrencyModeはConcurrencyMode.Multipleに設定され、InstanceContextModeはInstanceContextMode.PerCallに設定されます。私はAsyncPatternを実装する必要があるかもしれないと思う。あなたはそれについて何か指針を持っていますか? – Asdfg

+0

また、物事はその空洞操作だから、なぜ何かを返そうとするのはどうですか? – Asdfg

+0

私はAsyncPattern = trueとOperation2の戻り値の型として自分のメソッドをマークIAsyncResultになりました。私は実際に何を返すべきですか? – Asdfg

関連する問題