Несколько интерфейсов из одного сервиса 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>