Это можно сделать, и есть несколько способов сделать это.
Одна возможность - создать службу маршрутизации, которая будет содержать «публичный» адрес, с которым клиент всегда общается,Эта служба маршрутизации может затем, на основе некоторой конфигурации, перенаправить вызов соответствующей «реальной» службе.
Другой способ - фактически запустить процесс, который запускает обе службы, но их адресаопределены в конфиге.Если вы используете ту же привязку и тот же контракт (что имеет место), то вы можете «перевернуть» адрес службы, когда вы хотите изменить службу, которая будет принимать вызовы от клиента.Например, эта конфигурация направляет запросы к конечной точке в «http://machine -name: 8000 / Service» для службы A. Обратите внимание, что, поскольку вы определяете узлы служб для обеих служб, вам фактически необходим базовый адрес для службы Bтакже - в этом случае я использовал именованные каналы, к которым нельзя получить доступ через разные машины.
<system.serviceModel>
<services>
<service name="A">
<host>
<baseAddresses>
<add baseAddress="http://machine-name:8000/Service"/>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="MyInterface" />
</service>
<service name="B">
<host>
<baseAddresses>
<add baseAddress="net.pipe://localhost/ServiceBackup"/>
</baseAddresses>
</host>
<endpoint address="" binding="netNamedPipeBinding" contract="MyInterface" />
</service>
</services>
</system.serviceModel>
когда вы хотите изменить адрес для B, вы должны поменять местами адреса.
<system.serviceModel>
<services>
<service name="A">
<host>
<baseAddresses>
<add baseAddress="net.pipe://localhost/ServiceBackup"/>
</baseAddresses>
</host>
<endpoint address="" binding="netNamedPipeBinding" contract="MyInterface" />
</service>
<service name="B">
<host>
<baseAddresses>
<add baseAddress="http://machine-name:8000/Service"/>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="MyInterface" />
</service>
</services>
</system.serviceModel>
Программа хостинга будет выглядеть следующим образом:
public static void HostServices()
{
ServiceHost hostA = new ServiceHost(typeof(A));
ServiceHost hostB = new ServiceHost(typeof(B));
hostA.Open();
hostB.Open();
Console.WriteLine("Press ENTER to close");
Console.ReadLine();
hostA.Close();
hostB.Close();
}
Теперь, если ваши службы размещены в IIS (веб-хостинг), то это немного сложнее.Поскольку для «нормальной» активации требуется, чтобы файл .svc был частью адреса конечной точки, а каждый файл .svc связан с одним классом, адрес для A будет выглядеть примерно так: http://machine -name / services /a.svc , а адрес для B будет выглядеть примерно так: http://machine -name / services / b.svc .Поэтому в этом случае вам нужно создать пользовательскую ServiceHostFactory и использовать интеграцию маршрутов ASP.NET для создания URL-адреса без .svc для вашей службы.Затем вы будете использовать что-то похожее на предыдущий пример, чтобы решить, какая служба будет активирована.