2010-11-23 11 views
2

Ich versuche eine elegante Möglichkeit zu finden, einen Vorgang zu wiederholen, wenn ein WCF-Kanal im fehlerhaften Zustand ist. Ich habe versucht, die Policy Injection AB zu verwenden, um die Operation erneut zu verbinden und die Operation erneut zu versuchen, wenn beim ersten Aufruf eine Ausnahmefehler auftritt. Die PolicyInjection.Wrap-Methode scheint jedoch nicht das Wrapping der TransparentProxy-Objekte (von ChannelFactory.CreateChannel zurückgegebener Proxy).Retry-Mechanismus bei WCF-Betriebsaufruf, wenn Kanal im fehlerbehafteten Zustand

Gibt es einen anderen Mechanismus, den ich ausprobieren könnte oder wie ich versuchen könnte, die PIAB-Lösung richtig zu funktionieren - alle Links, Beispiele usw. würden sehr geschätzt werden. Hier

ist der Code, den ich wurde mit diesen versagte:
var channelFactory = new ChannelFactory(endpointConfigurationName);
var proxy = channelFactory.CreateChannel(...);
proxy = PolicyInjection.Wrap<IService>(proxy);

Danke.

Antwort

0

Vielen Dank für Ihre Antwort. Am Ende habe ich eine Decorator-Typ-Klasse erstellt, die die Schnittstelle meines Dienstes implementiert hat, die dann den von der ChannelFactory generierten transparenten Proxy umschlossen hat. Ich war dann in der Lage, den Policy Injection Application Block zu verwenden, um darüber eine Schicht zu erstellen, die Code in jeden Operationsaufruf injiziert, der die Operation versucht, und wenn eine CommunicationObjectFaultedException auftrat, würde der Channel abgebrochen, neu erstellt und die Operation wiederholt . Es funktioniert jetzt großartig - obwohl es gut funktioniert, der einzige Nachteil ist jedoch die Wrapper-Klasse erwähnt, dass jede Service-Operation zu implementieren, aber das war der einzige Weg, wie ich das PIAB verwenden könnte, da dies für mich Sinn machte für den Fall, dass ich eine gefunden habe In Zukunft war es einfach, einfach über Schnittstellen zu ändern.

3

würde ich eher Callback-Funktionen verwenden, etwa so:

private SomeServiceClient proxy; 

    //This method invokes a service method and recreates the proxy if it's in a faulted state 
    private void TryInvoke(Action<SomeServiceClient> action) 
    { 
     try 
     { 
      action(this.proxy); 
     } 
     catch (FaultException fe) 
     { 
      if (proxy.State == CommunicationState.Faulted) 
      { 
       this.proxy.Abort(); 
       this.proxy = new SomeServiceClient(); 
       //Probably, there is a better way than recursion 
       TryInvoke(action); 
      } 
     } 
    } 

    //Any real method 
    private void Connect(Action<UserModel> callback) 
    { 
     TryInvoke(sc => callback(sc.Connect())); 
    } 

Und in Ihrem Code sollten Sie rufen

ServiceProxy.Instance.Connect(user => MessageBox.Show(user.Name)); 

statt

var user = ServiceProxy.Instance.Connect(); 
MessageBox.Show(user.Name); 

Obwohl mein Code-Proxy verwendet -Klasse Ansatz, können Sie einen ähnlichen Code mit Channels schreiben.

+0

Vielen Dank für Ihre Antwort - es wird sehr geschätzt. Meine einzige Sorge mit dieser Lösung ist, dass ich für die 100-200 Serviceaufrufe, die ich habe, sicherstellen muss, dass jeder Aufruf eines Serviceaufrufs dann in eine ServiceProxy.Instance.TryInvoke verpackt wird, und um das hinzuzufügen, ein Wartungsalbtraum, der sicherstellt, dass alle zusätzlichen Serviceanrufe auch eingepackt werden - ich sehe keinen anderen Weg, um das zu umgehen, als den Policy Injection AppBlock (oder ein anderes AOP-Framework) zu verwenden - es sei denn, ich verpasse etwas. – CraigM