2016-11-18 4 views
1

У меня есть сервер & клиентское решение, использующее WCF. Клиент будет запрашивать услугу по URL-адресу активного сервера во время выполнения и для установки этого параметра я использую ChannelFactory. Однако мне все равно нужно использовать все остальные настройки WCF из файла конфигурации. Вот как я это делаю:WCF channelelfactory с настройками из файла конфигурации?

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; 
       } 
      } 

Проблема заключается в том, что я получил 2 BehaviorExtensions, которые используются некоторыми из конечных точек, как это.

<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> 

Вопрос в том, как я прочитал это из клиентских данных. и устанавливает его на channelFactory? Я знаю, что я мог бы создать вручную, как это:

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

Но тогда это будет жестко статична и она будет применяться ко всем конечным точкам, мне нужно, чтобы быть в состоянии изменить его из конфигурации.

ответ

0

Я хотел создать все в коде, смешанное решение было нехорошо, а не в моем случае, когда я использую много обычаев.

+0

Поздравляем. Но все же, ваш ответ полезен только с сом пример и объяснение .. –

0

Вам не нужно самостоятельно создавать ChannelFactory. Просто создайте класс ClientService, который наследуется от ClientBase<T>. Конструктор ClientBase<T> принимает имя EndpointName и автоматически добавляет поведение, связанное с этой конечной точкой. ClientBase<T> также дает вам возможность получить доступ к ChannelFactory<T>, и вы можете открыть столько каналов, сколько хотите. единственное, что вам нужно сделать дальше, - это добавить имя для каждого EndPoint в конфигурацию, которую вы хотите использовать.

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

Спасибо, но похоже, что мне нужно добавить код для каждого метода службы в этом классе ClientBase? Например: return base.Channel.MySimpleMethod (запрос); Это правда? У меня есть сотни веб-методов. – Banshee

+0

Да, это недостаток и нормальный путь. Мы работали над этим только с помощью двух методов. Наш WebService имеет 2 метода: один для запросов с результатами и один без результата. Все остальные вещи обрабатываются через запрос, мы просто смотрим на данный RequestType и вызываем обработчики, которые могут работать с запросами. – Rabban

+0

Извините, не правда ли? Как могли бы сотни веб-методов быть всего 2? У всех есть собственное имя метода, запрос и ответ? – Banshee

Смежные вопросы