创建WCF服务,在窗口服务中托管,尝试在该服务中使用。怎么做?

时间:2012-08-26 18:43:21

标签: c# wcf windows-services

我创建了一个WCF服务库。然后我创建了一个Windows服务来托管这个WCF服务。 现在我想在同一个窗口服务中调用WCF服务库中定义的函数。

    protected override void OnStart(string[] args)
    {
        if (serviceHost != null)
            serviceHost.Close();

        // Create a ServiceHost for the Registration type and 
        // provide the base address.
        serviceHost = new System.ServiceModel.ServiceHost(typeof(Registration));

        // Open the ServiceHostBase to create listeners and start 
        // listening for messages.
        serviceHost.Open();

        Registration r = new Registration();

        System.Threading.Thread t = new System.Threading.Thread(r.ReadAttempt);
        Object passParameterToCallback = null;
        t.IsBackground = false;
        t.Start(passParameterToCallback);
    }

2 个答案:

答案 0 :(得分:2)

如果您只需要在同一个类上调用方法,那么您已经在代码中通过创建new Registration()并在其上调用方法来执行此操作。没有理由通过WCF打电话。

如果由于某种原因你确实希望通过WCF给自己打电话,那么你应该构建一个客户端而不是实际的类。

如果需要调用WCF服务对象的相同实例,则必须将WCF服务设置为Single,然后调用WCF客户端。

或者使用this constructor获取单个对象的ServiceHost,然后在同一对象实例上调用方法,或者使用ServiceHost.SingletonInstance属性来获取传递的实例到构造函数。

答案 1 :(得分:1)

ServiceHost类还应该能够接受服务的单例实例而不是类型,具体如下: http://msdn.microsoft.com/en-us/library/ms585487.aspx

因此,尝试实例化类型为Registration的类,并将其传递给ServiceHost。这只能像我说的那样,使用单例类型的WCF服务,或者更具体地说,就是将InstanceContextMode设置为Single。

这样你就应该留下对这个类的引用,并且应该可以正常访问它。

虽然可能值得以另一种方式考虑这一切。如果您的问题只是通知Windows服务WCF服务中发生的事情,那么如何在WCF服务中定义事件,您的Windows服务可以以这种方式订阅和接收来自WCF服务的事件?

如果您需要在WCF服务中使用逻辑,那么如何将该逻辑提取到外部类或使其静态,以便您可以在任何地方使用它。

祝你好运