我有运行IIS 7.5的Windows 2008 R2 Server。目前,我使用WCF向外部公开接口,然后代码从我的DLL调用例程。
我想远离这种直接访问,并在C#中创建一些我可以在后台运行的守护进程。我将使用守护进程来监视线程,接受请求并平衡性能。我计划允许守护进程完全访问我的主应用程序的DLL,然后让WCF服务在收到守护进程时将命令传递给守护进程。
我查看了互联网,发现了一些关于创建Windows服务,构建安装程序和注册服务的示例;但是,我似乎找不到任何关于如何通过不同的应用程序与运行服务进行交互的文档。
这里或多或少是我要做的一个例子:
假设我已经构建并安装了此处描述的示例服务:http://blogs.msdn.com/b/bclteam/archive/2005/03/15/396428.aspx
现在,客户告诉我需要扩展它以允许作业按需运行。我已经构建了必要的功能以允许我这样做,但现在我面临的问题是确定如何与当前运行的服务进行通信以告诉它开始处理。我该怎么做呢?您是否有描述此IPC的示例链接?
谢谢!
答案 0 :(得分:1)
您可以使用WCF与Windows服务进行通信。
事实上,假设您有一个类库,其中包含一些您希望提供的API,如网络上的daemom,该机器上无需用户登录......
您可以拥有一个WCF端点,它将API公开给调用者,并在IIS或Windows服务中托管此服务,唯一的区别是您托管WCF的方式(IIS为您提供了使用方法.svc文件,Windows Service需要一些代码来启动WCF托管对象);在此之后,几乎所有东西都保持不变。
答案 1 :(得分:1)
您可以将自定义命令发送到Windows服务,但这些只是整数值:
protected override void OnCustomCommand(int command)
更好的解决方案是通过“命名管道”与Windows服务进行通信。实现这一目标的最佳方式是IMHO使用NetNamedPipe绑定创建WCF服务并将其托管在Windows服务本身。
答案 2 :(得分:0)
你看过这个:http://msdn.microsoft.com/en-us/library/ms733069.aspx
此外,如果您想在Visual Studio中调试服务的简单方法,我写了一篇关于它的博客文章:http://blog.tomasjansson.com/2010/11/debugging-your-windows-service-in-visual-studio/
答案 3 :(得分:0)
您必须使用ServiceController。一旦有了ServiceController实例,就可以调用ExecuteCommand(int)。只要您的命令不是“开始/停止/暂停”,ExecuteCommand将在您的服务实例中调用OnCustomCommand。只需覆盖OnCustomCommand即可设置...
ServiceController的参考:
http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx
答案 4 :(得分:0)
没有什么神奇的服务,它只是一个程序,它在系统而不是用户运行的启动时启动。您需要为您的服务编程某种形式的IPC(无论是配置文件还是更高级的东西,比如从目录加载所有dll并将已知函数作为入口点调用(这将是插件模型)。
您需要编写原始服务,以某种形式收听,以提供您想要的功能。
答案 5 :(得分:0)
IPC可以使用不同的方法完成:
TCP / IP
您的服务公开WCF / HTTP任何接口(例如使用ServiceHost
/ HttpListener
或甚至ServerSocket
) - 这些可以是本地和/或远程访问
NamedPipe
您可以使用命名管道进行通信 - 这些可以是本地和/或远程访问的
见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
答案 6 :(得分:0)
因此,您需要一个执行许多计划操作的Windows服务,并且还可以通过WCF监听请求以执行按需操作,我是否做到了这一点?
这是一个MSDN文档,解释了如何创建实现WCF服务的Windows服务: http://msdn.microsoft.com/en-us/library/ms733069.aspx