【问题标题】:instantiating multiple WCF services实例化多个 WCF 服务
【发布时间】:2013-09-04 18:53:35
【问题描述】:

假设您正在通过 WCF 服务控制一组工业设备。每个设备都将托管自己的 WCF 服务。让我们将此通用 WCF 服务称为MyDeviceController 我想编写一次并部署在每个设备上。但是出于测试目的,我还想在一个本地机器上部署所有 WCF 实例。

在这种情况下,如何部署多个 WCF 服务实例,包括本地和多个盒子?

如果我太含糊,请帮助我澄清我的问题。我非常乐意编辑它。

【问题讨论】:

  • 您可以在同一个盒子上拥有尽可能多的服务主机(每个主机1个服务实例)。每个服务主机都需要自己独特的端点。因此,例如,您可以拥有 http://server/device1http://server/device2 等 - 每个都将在自己的 ServiceHost 中运行。或者,由于它是相同的服务,您可以将它放在一个 ServiceHost 中并公开多个端点,但我认为这可能与您正在寻找的有点不同。

标签: c# wcf deployment instance


【解决方案1】:

我曾经写过一个好用的服务主机:

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 时返回实例。您可能需要增强课程以满足您的要求。但是您可以节省大量代码,尤其是当您需要动态托管多个服务时;-)

问候 一月

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2012-09-06
    • 2012-01-20
    • 1970-01-01
    • 2012-09-17
    • 2020-05-18
    相关资源
    最近更新 更多