如何让WCF工作可靠?

时间:2013-06-10 11:36:23

标签: c# wcf hosting

关于如何使我的WCF服务可靠,我有一些问题。

设置 我的服务包含3个WCF服务,2个是基于HTTP的常规Web服务,另一个是使用Protobuf的TCP服务。 TCP服务可以通过多种方式进行自定义,以使其在Winform clikent中尽可能好地工作。

然后将其托管在Windows服务中。

WCF项目包含一个CustomHostServiceFactory,其中ApplyConfiguration用于加载所有缓存数据(所有服务都使用缓存所在的BLL)。

protected override void ApplyConfiguration()
        {
            base.ApplyConfiguration();

            Startup();
        }

Windows服务在启动时包含以下内容

private ServiceHost StartService(Type serviceType)
        {
            ServiceHost serviceHost = null;

            // Create a ServiceHost for the CalculatorService type and 
            // provide the base address.
            Console.WriteLine("Creating service " + serviceType.FullName);
            serviceHost = new ServiceHost(serviceType);

            serviceHost.Opened += serviceHost_Opened;
            serviceHost.Closed += serviceHost_Closed;

            // Open the ServiceHostBase to create listeners and start 
            // listening for messages.
            Console.WriteLine("Starting service...");
            serviceHost.Open();
            Console.WriteLine("Service started successfully");
            Console.WriteLine("...");
            return serviceHost;

        }

此代码在Windows服务中使用Main(ServiceBase)和OnStart(覆盖)。

问题 现在我必须确保这是正确的设置原因吗?服务是否可以在启动期间但在缓存初始化之前接收呼叫?

2 个答案:

答案 0 :(得分:0)

不幸的是,该服务仅在调用.Open()后才接受请求。如果它尚未打开,您将发生EndpointNotFoundException

此外,服务本身的启动代码 - 即公共ctor()在第一个请求通过之前不会运行。

答案 1 :(得分:0)

  

现在我必须确保这是正确的设置原因?服务是否可以在启动期间但在缓存初始化之前接收呼叫?

确保init代码在serviceHost.Open();之前运行。

如果客户端在端点可用之前调用服务,则客户端将获得连接异常。当端点打开时,您可以确保在Open()之前调用了初始化代码,并且您的服务已准备好为请求提供服务。