我有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()
{
//////////
}
}
答案 0 :(得分:1)
一般来说,没有。这是因为默认情况下(并遵循最佳实践),您将服务配置为按呼叫(或每个会话)运行,这意味着您的服务主机中可能有多个实际服务实例正在运行。
因此,任何要求您能够从服务主机返回服务实例的要求都将涉及一些讨厌的管道代码,不建议这样做。
然而,具体而言,您可以使用两种方法来执行您想要的操作。
第一个涉及在InstanceContextMode.Single中运行您的服务 - 这意味着将有一个服务实例来处理所有请求。如果你这样做,那么你可以简单地创建服务实例,然后在启动Windows服务时将其传递给servicehost:
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服务中使用这些代码吗?
答案 1 :(得分: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
}
}