我有一个IIS服务,它将启动一个ASP.Net控制台应用程序。我想为控制台应用程序提供一个优雅的关闭。(即)关闭请求将来自web服务,控制台应用程序将做出响应&优雅地关闭。不使用任何端口就能做到这一点吗?
我能想到的一个解决方案是建立一个从控制台应用程序到web服务的长轮询链接。控制台应用程序是否有其他方法可以在不使用端口的情况下建立侦听机制?我的部署环境中有一些安全扫描器正在运行,如果它发现一个未经批准的开放端口,它就是坏的。
发布于 2014-03-18 01:05:43
我不是WCF专家,但是这个答案看起来会有帮助。他提到了这篇关于选择运输的MSDN文章。
从该条中:
何时使用命名管道传输 ..。当需要在一台计算机上进行不同WCF应用程序之间的通信时,如果您希望阻止来自另一台计算机的任何通信,则使用命名管道传输.
发布于 2014-03-18 01:20:23
我本来想说,您可以使用一个名为Mutex的线程,但考虑到多线程的猛兽,即ASP.Net,您将无法保证拥有的线程与释放它的线程相同。这可能会引起问题。所以..。
最简单的方法可能是使用文件系统。
让控制台应用程序实例化一个FileSystemWatcher,以监视两个进程都可以访问的目录,并为创建事件连接一个事件处理程序,如下所示:
internal static bool ShutDownRequested { get ; set ; }
private static void OnCreated( object sender , FileSystemEventArgs fileSystemEventArgs )
{
FileSystemWatcher watcher = (FileSystemWatcher) sender ;
ShutDownRequested = true ;
File.Delete( fileSystemEventArgs.FullPath ) ;
watcher.Created -= OnCreated ;
}
static void Main()
{
using ( FileSystemWatcher watcher = new FileSystemWatcher( @"\some\common\directory" , "foobar.shutdown.requested" ) )
{
watcher.Created += OnCreated;
while ( !ShutDownRequested )
{
DoSomethingUseful() ;
}
}
return ;
}
当您想关闭控制台应用程序时,只需创建控制台应用程序所期望的文件即可。控制台应用程序的事件处理程序捕获工作线程上的事件,然后设置全局关闭标志,这样主线程就可以在第一个合适的时间优雅地关闭,或者事件处理程序只需调用Environment.Exit(int)
并强制关闭它。不要忘记在哨兵文件完成任务后删除它来整理事情(这是唯一礼貌的事情)。
这就是我想做的,但是,我并不热衷于想太多的事情。
如果考虑过度,您可以以类似的方式使用命名事件。在您的ASP.Net服务中,创建了一个最初未发出信号的命名事件:
// start console app
EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.ManualReset,"foobar.shutdown.signal");
SpawnConsoleApp() ;
然后,当关闭控制台应用程序时:
// shutdown time
wh.Set() ;
(别忘了把等待柄放在安全的地方)
在控制台应用程序中,需要定期检查信号:
static void Main()
{
EventWaitHandle wh = EventWaitHandle.OpenExisting( "foobar.shutdown.signal" ) ;
while( !wh.WaitOne(0) )
{
DoSomethingUseful() ;
}
wh.Set() ; // acknowledge the signal
return ;
}
发布于 2014-03-18 02:26:51
http://msdn.microsoft.com/en-us/library/bb762927(v=vs.110).aspx
.NET框架内置了对命名管道的支持,这是一个不使用端口的IPC。
使用管道是很常见的。Microsoft IIS管理服务使用管道与工作进程通信,这就是一个例子。
https://stackoverflow.com/questions/22468168
复制相似问题