2015-02-18 5 views
1

Мне нужно установить службу WCF на одном сервере, но мне нужно прослушивать несколько портов (из-за различных проблем с машинами, на которых запущен клиент). Мне непонятно, можно ли это сделать с помощью одного ServiceHost и: один «класс, затуманенный» (CDF) ServiceBase с двумя endpoints, или если мне нужно два CDF ServiceBase s каждый с одним endpoint. Вот соответствующий код в соответствующих файлах:Служба WCF, слушая несколько портов

Program.cs

static class Program 
{ 
    static void Main() 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new Service1() 
     }; 
     ServiceBase.Run(ServicesToRun); 
    } 
} 

Service1.cs

public partial class Service1 : ServiceBase 
{ 
    private wcfServer _server; 
    ServiceHost serviceHost; 

    public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(String[] args) 
    { 
     _server = new wcfServer(); 
     serviceHost = new ServiceHost(_server); 
     serviceHost.Open(); 
    } 

    protected override void OnStop() 
    { 
     if (serviceHost != null) 
      serviceHost.Close(); 
    } 
} 

wcfServer.cs

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
    ConcurrencyMode=ConcurrencyMode.Multiple)] 
public class wcfServer : IwcfServer { /* ... */ } 

app.config

<services> 
    <service name="MyService.wcfServer"> 
     <endpoint address="" 
      bindingConfiguration="BigDataBinding" 
      binding="basicHttpBinding" 
      contract="DataBackups.IwcfServer"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
     </endpoint> 

     <endpoint address="mex" 
      binding="mexHttpBinding" 
      contract="IMetadataExchange" /> 

     <host> 
      <baseAddresses> 
       <add baseAddress="http://localhost/DataBackups/wcfServer/" /> 
      </baseAddresses> 
     </host> 
    </service> 
</services> 
</system.serviceModel> 

Я хотел бы отметить, что

  1. текущий «решение» в этом вопросе, чтобы изменить установки, чтобы позволить нам установить службу на сервере дважды.
  2. Целью службы является обработка нескольких параллельных запросов, которые частично передают большие данные (в случае, если это имеет значение).

Может ли кто-нибудь привести пример того, как это сделать?

Кроме того, я не понимаю, как конфигурации <service> в app.config относятся к CDF ServiceBase экземплярам, ​​созданным программно. В текущей настройке есть только один экземпляр Service1 и одна конфигурация в app.config, поэтому я думаю, что они «выстраиваются». Но что, если у меня есть несколько экземпляров Service1 (что мне может понадобиться)? Как я могу выбрать, какой сервис я настраиваю?

+0

'ServiceBase' является базовым классом, который представляет собой функцию службы Windows. Этот вид сервиса не имеет абсолютно никакого отношения к тому, что WCF вызывает услугу - неудачный случай перегрузки. При нормальных обстоятельствах вы реализуете только одну службу в исполняемом файле, и поэтому будет иметь только один класс, основанный на «ServiceBase». Затем эта служба может создавать несколько экземпляров «ServiceHost» и/или размещать несколько конечных точек для служб WCF. –

+0

Согласовано. У меня есть только один класс, полученный из «ServiceBase» («Service1»), и я хочу иметь доступ к нему из нескольких портов (в частности '80' и по умолчанию' 8732'). Является ли это означает, что у меня есть несколько «ServiceHost's» и/или «Service1's» и/или «конечная точка» - это именно мой вопрос. – jayflo

+2

Почему бы вам не настроить порт на брандмауэре. Сопоставьте внешние порты с одним внутренним портом? Это проще и гораздо более настраиваемо. – Namphibian

ответ

0

Ваш WCF У службы не должно быть проблем при прослушивании нескольких портов. Вам просто нужно расширить baseAddress раздел файла app.config следующим образом:

<baseAddresses> 
    <add baseAddress="http://localhost:80/DataBackups/wcfServer/" /> 
    <add baseAddress="http://localhost:8732/DataBackups/wcfServer/" /> 
</baseAddresses> 
+0

Это не работает.Я также попытался добавить эти URL-адреса в два разных поля «endpoint address =" "'. Я также пробовал практически любую другую комбинацию «baseaddress =» http: // localhost «с полями« конечный адрес », соответственно. Некоторые комбинации не работают на обоих портах, а другие - только на одном порту. – jayflo

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