【问题标题】:.net IPC without using ports.net IPC 不使用端口
【发布时间】:2014-03-18 00:29:01
【问题描述】:

我有一个 IIS ASP.Net Web 服务,它将启动一个 .net 控制台应用程序。我想为控制台应用程序提供优雅的关闭。 (ie) 关闭请求将来自 Web 服务,控制台应用程序将响应并正常关闭。不使用任何端口是否可以做到这一点?

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

【问题讨论】:

    标签: .net ipc


    【解决方案1】:

    我本来想说你可以使用一个命名的 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() ;
    

    (别忘了把等待把手放在安全的地方)

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

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

    【讨论】:

    • EventWaitHandle 看起来很有希望
    【解决方案2】:

    http://msdn.microsoft.com/en-us/library/bb762927(v=vs.110).aspx

    .NET Framework 内置了对命名管道的支持,这是一种不使用端口的 IPC。

    使用管道很常见。 Microsoft IIS Admin Service 使用管道与工作进程通信,这是一个示例。

    【讨论】:

    • 根据上下文,Windows 命名管道使用 UDP 端口 137/139、TCP/IP 端口 445 或内存映射文件之一。
    【解决方案3】:

    我不是 WCF 专家,但 this answer 看起来会有所帮助。他参考了choosing a transport上的这篇 MSDN 文章。

    来自那篇文章:

    何时使用命名管道传输

    ... 当需要在单台计算机上的不同 WCF 应用程序之间进行通信,并且您想阻止来自另一台计算机的任何通信时,请使用命名管道传输...

    【讨论】:

    • 如果只需要管道,则不需要使用 WCF。
    • @LexLi 不,但是 WCF 的抽象使它更易于使用。
    猜你喜欢
    • 2012-02-03
    • 1970-01-01
    • 2016-04-10
    • 2018-04-20
    • 2016-01-19
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多