【问题标题】:Running WCF service method during start of Windows Service在 Windows 服务启动期间运行 WCF 服务方法
【发布时间】:2015-03-05 17:07:10
【问题描述】:

我已将 WCF 服务作为 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()
    {
        //////////
    }

}

【问题讨论】:

  • 你能发布你的服务定义吗?
  • 你到底是什么意思? WCF 服务还是 Windows 服务?
  • WCF服务ServiceContract和服务实现

标签: wcf


【解决方案1】:

您没有解释为什么您希望此初始化代码运行,但鉴于您几乎不想使用单实例 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
    }
}

【讨论】:

    【解决方案2】:

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

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

    不过,具体来说,您可以使用两种方法来做您想做的事。

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

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

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

    service.MyOperation("something");
    

    当您不想运行单例服务时,您可以做的第二件事是,您可以使服务实现成为实际处理请求的共享类的静态实例的包装器。举个例子:

    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);
        }
    }
    

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

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

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

    【讨论】:

    • 谢谢,第二个选项看起来不错,我有异常“ServiceHost 仅支持类服务类型。”不过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    相关资源
    最近更新 更多