service WCF duplex se bloque sur appel de rappel
-
25-10-2019 - |
Question
Marché de services:
[ServiceContract(CallbackContract = typeof(IClientCallBackChannel),
SessionMode = SessionMode.Required)]
public interface IServerService
{
[OperationContract(IsOneWay = true)]
void foo();
}
Contrat client:
public interface IClientCallBackChannel
{
[OperationContract(IsOneWay = false)]
object DoCommand(Command command);
}
class ClientCallBackChannelImpl
{
public object DoCommand(Command command)
{
// freezes service
serverService.foo();
// OK
new Action(() =>
{
Thread.Sleep(1000);
serverService.foo();
}
).BeginInvoke(null,null);
}
}
J'ai un service duplex et quand je fais appel une méthode client « DoCommand » que dans cette méthode, il est un appel à une méthode de service foo, mes gels de service. Si je l'appelle foo de manière asynchrone il fonctionne très bien, mais je dois l'appel à être synchrone.
La solution
Je pense que le problème est que vous avez besoin du DoCommand pour retourner une valeur et donc ne sont pas en mesure de le faire à sens unique. Si vous pensez à ce sujet, cela doit bloquer votre service.
Vous pouvez définir ConcurrencyMode de votre ServiceBehavior à plusieurs et cela devrait fonctionner, mais à mon humble avis ce n'est pas la meilleure option.
Comme vous avez un essai de communication bidirectionnelle coller à OneWay-Méthodes -. Cela va résoudre le problème et vous éviter des problèmes de concurency difficiles avec ce qui précède le comportement mentionné