Несколько интерфейсов из одного сервиса WCF?

Может ли одна служба WCF предлагать несколько интерфейсов, и если да, то как бы вы выразили это в app.config?

Я имею в виду один сервис, предлагающий несколько интерфейсов на одной конечной точке.

5 ответов

Решение

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

Предполагая, что вы имеете в виду одну конечную точку, тогда да, но с небольшой работой. Конечная точка может реализовать только один интерфейс; так что вам нужно объединить все интерфейсы, которые вы хотите реализовать, в один интерфейс

public interface IMyInterface : IInterface1, IInterface2

а затем реализовать их все внутри вашего класса реализации. Чего вы не можете сделать, так это иметь несколько интерфейсов, и несколько реализаций волшебным образом объединяются в одну конечную точку.

Следующее выглядит ближе к первоначальной цели и не включает в себя один большой интерфейс...

Несколько конечных точек в одном ListenUri: http://msdn.microsoft.com/en-us/library/aa395210.aspx


В приведенном выше примере объясняется, что можно зарегистрировать несколько конечных точек по одному и тому же физическому адресу (listenUri), каждый из которых реализует свой интерфейс (контракт), например:

<endpoint address="urn:Stuff"
        binding="wsHttpBinding"
        contract="Microsoft.ServiceModel.Samples.ICalculator" 
        listenUri="http://localhost/servicemodelsamples/service.svc" />
<endpoint address="urn:Stuff"
        binding="wsHttpBinding"
        contract="Microsoft.ServiceModel.Samples.IEcho" 
        listenUri="http://localhost/servicemodelsamples/service.svc" />
<endpoint address="urn:OtherEcho"
        binding="wsHttpBinding"
        contract="Microsoft.ServiceModel.Samples.IEcho" 
        listenUri="http://localhost/servicemodelsamples/service.svc" />

Это возможно, потому что входящие сообщения направляются в соответствующую конечную точку на основе комбинации фильтров адресов и контрактов.

С WCF вы можете:

  • иметь один класс реализации сервиса, который реализует несколько интерфейсов сервиса
  • один класс реализации службы доступен через несколько конечных точек, например, одна конечная точка службы, использующая BasicHttpBinding для максимальной совместимости, и другая конечная точка, использующая NetTcpBinding для максимальной производительности (с клиентами WCF).

Если ваш класс реализации становится слишком большим (как мой), попробуйте реализовать суперинтерфейс в частичном классе. Вы можете поместить одну реализацию интерфейса в один файл. Это просто соглашение, но может пригодиться позже.

Вот как вы можете выставить один и тот же интерфейс на двух разных конечных точках в вашем App.Config, если это то, о чем вы спрашиваете.

<service name="Service1">    
   <endpoint address="http://localhost:8001/service1.asmx" binding="basicHttpBinding" contract="IService" />
</service>
<service name="Service2">    
  <endpoint address="http://localhost:8002/service2.asmx" binding="basicHttpBinding"  contract="IService" />
</service>
Другие вопросы по тегам