创建和使用c# Windows服务

本文关键字:Windows 服务 创建 | 更新日期: 2023-09-27 18:03:54

我有一台运行IIS 7.5的Windows 2008 R2服务器。目前,我使用WCF向外部公开接口,然后代码从dll调用例程。

我想摆脱这种直接访问,并在c#中创建某种我可以在后台运行的守护进程。我将使用守护进程监视线程、接受请求并平衡性能。我计划允许守护进程完全访问主应用程序的dll,然后让WCF服务在接收到命令时将命令传递给守护进程。

我在互联网上找到了一些关于创建Windows服务,构建安装程序和注册服务的例子;然而,我似乎找不到任何关于如何通过不同的应用程序与正在运行的服务交互的文档。

这是我想要做的一个或多或少的例子:

假设我已经构建并安装了下面描述的样例服务:http://blogs.msdn.com/b/bclteam/archive/2005/03/15/396428.aspx

现在,一个客户告诉我,我需要扩展它以允许作业按需运行。我已经构建了必要的函数来允许我这样做,但是现在我面临的问题是确定如何与当前正在运行的服务对话以告诉它开始处理。我该怎么做呢?你有任何描述IPC的示例链接吗?

谢谢!

创建和使用c# Windows服务

您可以向Windows服务发送自定义命令,但这些命令只能是整数值:

protected override void OnCustomCommand(int command)

一个更好的解决方案是通过"命名管道"与Windows服务通信。实现这一点的最佳方法是创建一个带有NetNamedPipe绑定的WCF服务,并将其托管在Windows服务中。

您可以使用WCF与Windows服务通信。

事实上,假设你有一个类库,里面有一些api,你想让它像网络上的守护进程一样可用,在那台机器上不需要用户登录…

你可以有一个WCF端点,它将api暴露给调用者,并在IIS或Windows服务中托管此服务,唯一的区别是你托管WCF的方式(IIS使用。svc文件为你做,Windows服务需要一点代码来启动WCF托管对象);在此之后,几乎所有内容都保持不变。

你看过这个吗:http://msdn.microsoft.com/en-us/library/ms733069.aspx

另外,如果你想在visual studio中简单地调试你的服务,我已经写了一篇关于它的博客文章:http://blog.tomasjansson.com/2010/11/debugging-your-windows-service-in-visual-studio/

必须使用ServiceController。一旦你有了ServiceController实例,你就可以调用ExecuteCommand(int)。只要你的命令不是启动/停止/暂停,ExecuteCommand就会在你的服务实例中调用OnCustomCommand。只需重写OnCustomCommand,你应该设置…

Reference for ServiceController:

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx

服务没有什么神奇之处,它只是一个在启动时启动的程序,由系统而不是用户运行。你需要在你的服务中加入某种形式的IPC(可以是像配置文件这样简单的东西,也可以是更高级的东西,比如从一个目录中加载所有的dll,并调用一个已知的函数作为入口点(这将是插件模型)。

您将需要编写您的原始服务以某种形式侦听以提供您想要的功能。

所以你需要一个windows服务来执行一些预定的操作,也可以通过WCF监听请求来执行按需操作,我理解对了吗?

下面是一个MSDN文档,解释如何创建一个实现WCF服务的windows服务:http://msdn.microsoft.com/en-us/library/ms733069.aspx

IPC可以通过不同的方法完成:

  • TCP/IP
    你的服务公开了一个WCF/HTTP接口(例如使用ServiceHost/HttpListener甚至ServerSocket) -这些可以是本地和/或远程访问的

  • NamedPipe
    您可以使用命名的Pipe进行通信——这些可以是本地和/或远程访问的
    见http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeserverstream.aspx

  • MemoryMappedFile
    非常快,只在本地工作,需要某种同步(如Mutex或类似的)
    参见http://weblogs.asp.net/gunnarpeipman/archive/2009/06/21/net-framework-4-0-using-memory-mapped-files.aspx和http://msdn.microsoft.com/en-us/library/dd997372.aspx