2016-11-18 5 views
1

Ich habe einen Server & Client-Lösung, die WCF verwenden. Der Client wird zur Laufzeit einen Dienst über die URL zu einem aktiven Server fragen und um dies einstellen zu können, verwende ich ChannelFactory. Ich muss jedoch immer noch alle anderen WCF-Einstellungen aus der Konfigurationsdatei verwenden. Dies ist, wie ich es tun:WCF channelfactory mit Einstellungen aus der Konfigurationsdatei?

var clientSection = ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection; 

      var address = string.Empty; 
      for(int i = 0; i < clientSection.Endpoints.Count; i++) 
      { 
       if(clientSection.Endpoints[i].Name == endpointConfigurationName) 
       { 
        var endpointAddress = new EndpointAddress(clientSection.Endpoints[i].Address.ToString()); 
        var netHttpBinding = new NetHttpBinding(clientSection.Endpoints[i].BindingConfiguration); 
        var serviceEndpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(T)), netHttpBinding, endpointAddress); 

        var channelFactory = new ChannelFactory<T>(serviceEndpoint); 

        break; 
       } 
      } 

Das Problem ist, dass ich 2 BehaviorExtensions bekam, die von einigen der Endpunkte wie diese verwendet werden.

<services> 
<endpoint binding="netHttpBinding" behaviorConfiguration="protoEndpointBehavior" address="BinaryHttpProto" bindingNamespace="http://MyApp.ServiceContracts/2007/11" contract="MyApp.ServiceContracts.IMyAppClientService" /> 
</services> 

<behaviors> 
<endpointBehaviors> 
     <behavior name="protoEndpointBehavior"> 
      <protobuf /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 

<extensions> 
     <behaviorExtensions> 
     <add name="protobuf" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=2.0.0.668, Culture=neutral, PublicKeyToken=257b51d87d2e4d67" /> 
     </behaviorExtensions> 
    </extensions> 

Die Frage ist, wie lese ich das aus dem clientSection.Endpoints? und setzt es auf der channelFactory? Ich weiß, dass ich dann manuell wie dies schaffen könnte:

serviceEndpoint.EndpointBehaviors.Add(new ProtoEndpointBehavior()); 
      serviceEndpoint.EndpointBehaviors.Add(new CustomMessageInspectorBehavior()); 

Aber dann wird dies ein hart codiert statisch sein und es wird an alle Endpunkte anzuwenden, muss ich es ändern aus der Config können.

Antwort

0

Ich musste alles im Code erstellen, eine gemischte Lösung war nicht gut, nicht in meinem Fall, wo ich viele benutzerdefinierte Sachen benutze.

+0

Herzlichen Glückwunsch. Aber trotzdem ist Ihre Antwort nur mit Beispiel und Erklärung nützlich. –

0

Sie müssen die ChannelFactory nicht selbst erstellen. Erstellen Sie einfach eine ClientService-Klasse, die von ClientBase<T> erbt. Der Konstruktor der ClientBase<T> akzeptiert einen EndpointName und fügt automatisch das Verhalten hinzu, das diesem Endpoint zugeordnet ist. Die ClientBase<T> gibt Ihnen auch die Möglichkeit, auf die ChannelFactory<T> zuzugreifen und Sie können so viele Kanäle öffnen, wie Sie möchten. Sie müssen nur noch einen Namen für jeden EndPoint in der zu verwendenden Konfiguration hinzufügen.

<endpoint binding="..." name="MyEndPoint" ... /> 
+0

Danke, aber es sieht aus wie ich Code für jede Service-Methode in dieser ClientBase-Klasse hinzufügen muss? Wie folgt: return base.Channel.MySimpleMethod (request); Ist das wahr? Ich habe Hunderte von Webmethoden bekommen. – Banshee

+0

Ja, das ist der Nachteil und der normale Weg. Wir haben mit nur 2 Methoden daran gearbeitet. Unser WebService hat 2 Methoden, eine für Anfragen mit Ergebnissen und eine ohne Ergebnis. Alle anderen Dinge werden durch die Anfrage behandelt, wir schauen uns einfach den gegebenen RequestType an und rufen die Handler auf, die mit den Anfragen arbeiten können. – Rabban

+0

Tut mir leid, nicht wirklich zu verstehen? Wie können Hunderte von Webmethoden nur 2 sein? Alle benötigen dort eigenen Methodenname, Anfrage und Antwort? – Banshee

Verwandte Themen