运行 Windows 服务启动期间的 WCF 服务方法

Running WCF service method during start of Windows Service

我有 WCF 服务 运行ning 作为 Windows 服务,当 Windows 服务启动时,我需要 运行 WCF 服务的一个方法。有可能吗?

[ServiceContract]
public interface IWebMonitorServiceLibrary
{
    [OperationContract]
    void TestMethod();
}

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class WebMonitorServiceLibrary : IWebMonitorServiceLibrary
{
    #region properties
    #endregion


    #region events
    #endregion


    public WebMonitorServiceLibrary()
    {
        Initialization();
    }

    private void Initialization()
    {
        /////////
    }


    public void TestMethod()
    {
        //////////
    }

}

一般不会。这是因为默认情况下(并遵循最佳实践)您会将服务配置为 运行 每次调用(或每次会话),这意味着您的实际服务可能有多个实例 运行ning您的服务主机。

因此,任何要求您能够 return 来自服务主机的服务实例的要求都将涉及一些讨厌的管道代码,因此不建议这样做。

但是,具体来说,您可以使用两种方法来完成您想要的操作。

第一个涉及 运行在 InstanceContextMode.Single 中设置您的服务 - 这意味着将有一个服务实例来处理所有请求。如果这样做,那么您可以简单地创建服务实例,然后在启动 windows 服务时将其传递给服务主机:

var service = new MyService();
var host = new ServiceHost(service);

然后您可以访问服务实例并可以直接调用操作。

service.MyOperation("something");

当您不想 运行 单例服务时,您可以做的第二件事是让您的服务实现只是一个共享 class 的静态实例的包装器,实际上处理请求。例如:

public class MyService : IMyService 
{ 
    private static IMyService instance = new MySharedServiceClass();

    public static IMyService Instance 
    { 
        get { return instance ; } 
    }

    public bool MyOperation(string something)
    {
       return instance.MyOperation(something);
    }
}

然后你可以像这样调用 class 上的方法:

var host = new ServiceHost(typeof(MyService));
var instance = MyService.Instance;
instance.MyOperation("something");

如果可能的话,我仍然会避免这样做。想想你自己为什么要在启动时调用这个方法?如果在启动时需要 运行 的话,直接将此代码放在 windows 服务中当然会更好?

你没有解释 为什么 你想要这个初始化代码 运行,但是考虑到你几乎从不想使用单实例 WCF 服务,正确的方法是使用依赖注入(参见 How do I pass values to the constructor on my wcf service?)。

创建一个对象,在其中存储要初始化的内容,在 Windows 服务启动时初始化:

public class SomeSettingsYouWantToInitialize
{
    public string SomeSetting { get; set; }
}

public class WindowsServiceInstance : ServiceBase
{
    protected override void OnStart(string[] args)
    {
        InitializeWcfService();
    }

    private void InitializeWcfService()
    {
        var settings = new SomeSettingsYouWantToInitialize
        {
            SomeSetting = "Foo"
        };

        _yourDependencyContainer.Register<SomeSettingsYouWantToInitialize>(settings);       
    }
}

然后(使用您使用的任何依赖注入框架),将其注入到您服务的构造函数中:

public class WebMonitorServiceLibrary
{
    public WebMonitorServiceLibrary(SomeSettingsYouWantToInitialize settings)
    {
        // do stuff with settings
    }
}