运行 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
}
}
我有 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
}
}