Мне нужно установить службу 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>
Я хотел бы отметить, что
- текущий «решение» в этом вопросе, чтобы изменить установки, чтобы позволить нам установить службу на сервере дважды.
- Целью службы является обработка нескольких параллельных запросов, которые частично передают большие данные (в случае, если это имеет значение).
Может ли кто-нибудь привести пример того, как это сделать?
Кроме того, я не понимаю, как конфигурации <service>
в app.config
относятся к CDF ServiceBase
экземплярам, созданным программно. В текущей настройке есть только один экземпляр Service1
и одна конфигурация в app.config
, поэтому я думаю, что они «выстраиваются». Но что, если у меня есть несколько экземпляров Service1
(что мне может понадобиться)? Как я могу выбрать, какой сервис я настраиваю?
'ServiceBase' является базовым классом, который представляет собой функцию службы Windows. Этот вид сервиса не имеет абсолютно никакого отношения к тому, что WCF вызывает услугу - неудачный случай перегрузки. При нормальных обстоятельствах вы реализуете только одну службу в исполняемом файле, и поэтому будет иметь только один класс, основанный на «ServiceBase». Затем эта служба может создавать несколько экземпляров «ServiceHost» и/или размещать несколько конечных точек для служб WCF. –
Согласовано. У меня есть только один класс, полученный из «ServiceBase» («Service1»), и я хочу иметь доступ к нему из нескольких портов (в частности '80' и по умолчанию' 8732'). Является ли это означает, что у меня есть несколько «ServiceHost's» и/или «Service1's» и/или «конечная точка» - это именно мой вопрос. – jayflo
Почему бы вам не настроить порт на брандмауэре. Сопоставьте внешние порты с одним внутренним портом? Это проще и гораздо более настраиваемо. – Namphibian