Ho un'applicazione basata su un servizio Duplex WCF. Ho problemi quando l'utente "riavvia" il lavoro che l'applicazione fa ... sotto il cofano, il lato client chiude la connessione al servizio WCF e ne crea un altro. Il contratto di servizio è definita in questo modo ...WCF Duplex Service Channel Close
[ServiceContract(Namespace="net.tcp://namespace.MyService",
SessionMode=SessionMode.Required,
CallbackContract=typeof(IServiceCallback))]
public interface IMyService
{
[OperationContract(IsOneWay=true)]
void DoWork();
}
public interface IServiceCallback
{
[OperationContract(IsOneWay=true)]
void SendMessage(string message);
}
L'implementazione è definito come:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single,
InstanceContextMode = InstanceContextMode.PerSession,
UseSynchronizationContext = false,
IncludeExceptionDetailInFaults = true)]
public class MyService : IMyService
{
public void DoWork()
{
var callback = OperationContext.Current.GetCallbackChannel<IServiceCallback>();
callback.SendMessage("Hello, world.");
}
}
La configurazione per il client è la seguente:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="net.tcp" receiveTimeout="02:00:00" sendTimeout="02:00:00" maxReceivedMessageSize="2147483647">
<security mode="None"/>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:8000/MyService/MyService"
binding="netTcpBinding" bindingConfiguration="net.tcp" contract="ExternalServiceReference.IMyService">
</endpoint>
</client>
</system.serviceModel>
Config per il servizio :
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehaviour">
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding name="netTcp" sendTimeout="01:00:00" receiveTimeout="01:00:00" >
<security mode="None">
</security>
</binding>
</netTcpBinding>
</bindings>
<services>
<service behaviorConfiguration="serviceBehaviour" name="MyService.MyService">
<endpoint address="MyService" binding="netTcpBinding" bindingConfiguration="netTcp" name="net.tcp" contract="MyService.IMyService" />
<endpoint binding="mexTcpBinding" bindingConfiguration="" name="net.tcp" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8000/MyService" />
</baseAddresses>
</host>
</service>
</services>
Nel contructor del cliente:
var callback = new CallbackImplementation();
_context = new InstanceContext(callback);
_proxy = new MyServiceProxy(_context);
sto cercando il seguente prima di stabilire una nuova connessione:
try
{
if (_context != null)
{
_context.ReleaseServiceInstance();
_context.Close();
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
if (_context != null)
{
_context.Abort();
}
}
Il problema che vedo è che la chiamata _context.Close() scade sempre e genera un'eccezione. Anche se interrompo il canale, questo mi sembra sbagliato, e credo che sia la causa del congelamento nella mia applicazione. Qualcuno sa perché la chiamata a Close() fallisce?
MODIFICA: Ho perso qualcosa in precedenza per quanto riguarda la mia implementazione di callback che potrebbe essere rilevante. Sembra qualcosa di simile a questo:..
[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Single,
UseSynchronizationContext = false,
IncludeExceptionDetailInFaults = true)]
public class CallbackImplementation : IServiceCallback
{
public void SendMessage(string message)
{
// Do something with the message
}
}
Il messaggio di eccezione è "Il ServiceHost operazione di chiusura scaduta dopo 0:00:30 Questo potrebbe essere perché un cliente non è riuscito a chiudere un canale con sessione entro il tempo richiesto Il tempo assegnato a questa operazione potrebbe essere stata una parte di un timeout più lungo. ". Non c'è eccezione interiore.
Grazie
Prova ad aggiungere un gestore di eventi 'OnClose'. Verifica se l'evento viene attivato sul lato server 'callback'. – mrtig
Grazie, l'ho appena provato: gli eventi di chiusura e chiusura stanno sparando. – MrShoes
Ma il servizio sta ancora scadendo? Hai provato a impostare 'CloseTimeout' sull'associazione? – mrtig