Я написал простой в обращении службы хост один раз:
public static class SimpleServiceHost<ServiceContract, Service>
{
private static Thread hostThread;
private static object _lockStart = new object();
private static object _lockStop = new object();
public static bool IsRunning { get; set; }
public static void WaitUntilIsStarted()
{
while (!IsRunning)
{
Thread.Sleep(100);
}
}
public static void Start(Binding binding, string host, string path, int port)
{
var serviceUri = new UriBuilder(binding.Scheme, host, port, path).Uri;
Start(binding, serviceUri);
}
public static void Start(Binding binding, Uri serviceUri)
{
lock (_lockStart)
{
if (hostThread == null || !hostThread.IsAlive)
{
hostThread = new System.Threading.Thread(() =>
{
using (ServiceHost internalHost = new ServiceHost(typeof(Service)))
{
internalHost.Faulted += new EventHandler((o, ea) =>
{
IsRunning = false;
throw new InvalidOperationException("The host is in the faulted state!");
});
internalHost.AddServiceEndpoint(typeof(ServiceContract), binding, serviceUri);
try
{
internalHost.Open();
IsRunning = true;
}
catch
{
IsRunning = false;
}
while (true)
Thread.Sleep(100);
}
});
}
hostThread.Start();
}
}
public static void Stop()
{
lock (_lockStart)
{
lock (_lockStop)
{
hostThread.Abort();
IsRunning = false;
}
}
}
}
Так что, если вы готовы использовать несколько контрактов вы можете просто позвонить так:
SimpleServiceHost<IService, Service>.Start(new BasicHttpBinding(), "localhost", "TestService", 8086);
В противном случае сделать свой сервис принимающей работу как фабрика и возвращать экземпляры при вызове start. Вероятно, вам нужно будет повысить класс, чтобы соответствовать вашим требованиям. Но сэкономить много кода, особенно когда вам нужно динамически разместить несколько сервисов ;-)
С уважением Jan
Вы можете иметь столько узлов услуг (1 экземпляр службы на хосте), как у вас есть ресурсы для проведения тот же самый ящик. Каждому хозяину службы будет свой собственный уникальный конечный пункт. Так, например, вы могли бы иметь «http: // server/device1», «http: // server/device2» и т. Д. - каждый из них запускался бы в своем собственном «ServiceHost». В качестве альтернативы, поскольку его та же услуга вы можете поместить в один «ServiceHost» и выставить несколько конечных точек, но я думаю, что это может быть немного отличается от того, что вы ищете. – Tim