私のサービスの一部のメソッドで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);
}
}
ConcurrencyModeはConcurrencyMode.Multipleに設定され、InstanceContextModeはInstanceContextMode.PerCallに設定されます。私はAsyncPatternを実装する必要があるかもしれないと思う。あなたはそれについて何か指針を持っていますか? – Asdfg
また、物事はその空洞操作だから、なぜ何かを返そうとするのはどうですか? – Asdfg
私はAsyncPattern = trueとOperation2の戻り値の型として自分のメソッドをマークIAsyncResultになりました。私は実際に何を返すべきですか? – Asdfg