gpt4 book ai didi

.net IPC 不使用端口

转载 作者:行者123 更新时间:2023-12-01 06:22:36 26 4
gpt4 key购买 nike

我有一个 IIS ASP.Net Web 服务,它将启动一个 .net 控制台应用程序。我想为控制台应用程序提供正常关闭。 (ie) 关闭请求将源自网络服务,控制台应用程序将响应并正常关闭。是否可以在不使用任何端口的情况下执行此操作?

我能想到的一个解决方案是建立一个从控制台应用程序到网络服务的长轮询链接。控制台应用程序是否可以通过其他方式在不使用端口的情况下建立监听机制?我的部署环境有一些安全扫描器在运行,如果它发现一个未经批准的开放端口,那就糟糕了。

最佳答案

我想说的是您可以使用命名的 Mutex,但考虑到 ASP.Net 这种多线程怪兽,您无法保证拥有线程与释放它的线程相同。这可能会导致问题。所以...

最简单的方法可能是使用文件系统。

让控制台应用实例化一个 FileSystemWatcher监视两个进程都可以访问更改的目录,并为 Created event 连接一个事件处理程序,像这样:

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() ;

(不要忘记将等待 handle 存放在安全的地方)

在您的控制台应用程序中,您需要定期检查信号:

static void Main()
{
EventWaitHandle wh = EventWaitHandle.OpenExisting( "foobar.shutdown.signal" ) ;
while( !wh.WaitOne(0) )
{
DoSomethingUseful() ;
}
wh.Set() ; // acknowledge the signal
return ;
}

关于.net IPC 不使用端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22468168/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com