我试图弄清楚如何将WCF服务作为后台Windows服务运行。
到目前为止,在我看到的所有示例中,对于REST-WCF Web服务主机或双工WCF服务主机,它们最终运行一个启动接口/服务并等待其关闭的小型控制台。
如何安装这些服务并让它们在后台运行?
我看到这是用一个普通的服务完成的,它创建了一些文件:ServiceInstaller
、ProjectInstaller.cs
等等。
发布于 2015-06-16 07:40:01
TLDR;
下面是我如何做到这一点,我有一个Program类,它允许我以Windows (用于生产)或控制台应用程序(用于调试和简单测试)启动我的应用程序。
internal class Program
{
private static void Main(string[] args)
{
var appMgr = new ApplicationManager();
// pass --console and it runs as console!
if (args.ToList().Contains("--console"))
{
appMgr.Start();
Console.Read(); // blocking here until key press
appMgr.Stop();
}
else
{
var winService = new WinService(appMgr);
ServiceBase.Run(winService);
}
}
}
我的WinService看起来就像
public class WinService : ServiceBase
{
private readonly ApplicationManager _appMgr;
public WinService(ApplicationManager applicationManager)
{
if (applicationManager == null)
throw new ArgumentNullException("applicationManager");
_appMgr = applicationManager;
}
protected override void OnStart(string[] args)
{
_appMgr.Start();
}
protected override void OnStop()
{
_appMgr.Stop();
}
}
然后我们去实现一个应用程序管理器。这可以跟踪您需要的所有线程和工作人员。
public class ApplicationManager
{
private WcfHost _bulkRulesWcfHost;
public void Start()
{
// ...
SetupWcf();
}
public void Stop()
{
// ...
if (_bulkRulesWcfHost != null)
_bulkRulesWcfHost.Stop();
}
private void SetupWcf()
{
// you can have many WCF services here
// ...
IBulkRules syncService = new BulkRulesService(...);
_bulkRulesWcfHost = new WcfHost(syncService, "BulkRulesService");
_bulkRulesWcfHost.Start();
}
}
此时您应该会想,WcfHost是什么?
public class WcfHost
{
private readonly ServiceHost _serviceHost;
public WcfHost(object service, string name)
{
if (service == null) throw new ArgumentNullException("service");
if (String.IsNullOrEmpty(name)) throw new ArgumentNullException("name");
_serviceHost = new ServiceHost(service);
Name = name;
}
public string Name { get; private set; }
public void Start()
{
if (_serviceHost != null)
_serviceHost.Open();
}
public void Stop()
{
if (_serviceHost != null)
_serviceHost.Close();
}
}
任务完成了。唯一缺少的是XML中的配置,我将其存储为app.config。
<configuration>
<system.serviceModel>
<services>
...
</service>
<behaviors>
<serviceBehaviors>
...
</serviceBehaviors>
</behaviors>
<bindings>
...
</bindings>
</system.serviceModel>
</configuration>
https://stackoverflow.com/questions/30871543
复制