Azure 如何跨2个w3wp.exe IIS进程共享信号量

Azure 如何跨2个w3wp.exe IIS进程共享信号量,azure,iis,semaphore,w3wp,Azure,Iis,Semaphore,W3wp,如何在Azure上创建可跨2个单独的w3wp.exe进程访问的信号量。 Azure上的问题是,当添加新的应用程序配置项时,Azure会在新的w3wp.exe进程上重新启动我的网站,该进程在关闭时与旧的w3wp.exe进程同时运行。我使用一个信号量在2之间进行同步。到目前为止,这项功能一直运行良好,即在本地IIS上-配置更改通常只需启动一个新的应用程序域,但在Azure上会启动一个新的w3wp.exe进程。而且这个新进程不识别现有的命名信号量 以下代码始终指示信号量不存在。即使我创建了一个独立的控

如何在Azure上创建可跨2个单独的w3wp.exe进程访问的信号量。 Azure上的问题是,当添加新的应用程序配置项时,Azure会在新的w3wp.exe进程上重新启动我的网站,该进程在关闭时与旧的w3wp.exe进程同时运行。我使用一个信号量在2之间进行同步。到目前为止,这项功能一直运行良好,即在本地IIS上-配置更改通常只需启动一个新的应用程序域,但在Azure上会启动一个新的w3wp.exe进程。而且这个新进程不识别现有的命名信号量

以下代码始终指示信号量不存在。即使我创建了一个独立的控制台应用程序并创建了信号量,我仍然发现它并不存在于我的web应用程序中。Azure上的IIS中似乎有一个用于信号量的命名空间。我曾在早期版本的IIS上看到另一篇文章,该文章指出,如果进程将Global\作为名称前缀,则信号量只能在进程之间进行全局共享-这在Azure上不起作用,我也不知道全局名称空间应该是什么-有什么想法吗

仅供参考-如果我运行一个控制台应用程序-2个实例-它们都访问相同的信号量,它们都可以看到它。但Azure上IIS中运行的2个进程无法运行

try
{
    // Open the semaphore 
    //
    _semaphore2 = Semaphore.OpenExisting(name);
    doesNotExist = false;
}
catch (WaitHandleCannotBeOpenedException)
{
    _logger.Info<MainDom>("Semaphore ({name}) does not exist", name);
    doesNotExist = true;
}

产生新工作进程的行为称为重叠回收。您可以禁用此行为,并允许工作进程在新进程启动之前完全关闭。您甚至可以在配置更改时禁用回收

对于本地IIS,修改应用程序池的高级属性,并配置禁用重叠回收和/或禁用配置更改回收选项。我相信后者仅在IIS 10+中可用

Azure的过程有点复杂。它涉及更新需要使用Kudu的applicationHost.config。有关详细说明,请参阅

本质上,它涉及到创建一个XDT转换文件来更新配置文件。例如:

编辑:

如果上述情况不能阻止两个工作进程同时运行,则可能还需要配置关闭时间限制。在变换文件中,将第二行包括在以下块中:

<add name="yourAppPoolNameHere" autoStart="true" managedRuntimeVersion="v4.0">
    <processModel shutdownTimeLimit="00:00:01" />

警告,上述操作将导致svchost.exe在1秒后毫无保留地终止w3wp.exe进程。

这是一种解决方法,不是答案,而是在这里发布,以防对其他人有所帮助,因为它隐藏在我的一条注释中,默认情况下是隐藏的


在Azure应用程序设置中将WEBSITE_DISABLE_OVERLAPPED_RECYCLING设置为1可以序列化w3wp进程,即一个进程将在另一个进程启动之前完全关闭-在我的情况下,这避免了对信号量的需要。我仍然想要原始问题的答案。

为什么不使用命名互斥,这是机器范围的,谢谢你的建议-这是一个好主意。但是,在Azure 2 w3wp进程上,即使名称具有Global\前缀,也看不到由其他进程创建的命名互斥体。使用建议互斥体是否创建为新的重载-两个进程都报告它们都创建了新的互斥体。谢谢-这是一个很好的建议,如果我能确保在回收过程中,1个w3wp进程在另一个进程启动之前完全关闭-这对我来说是可行的。然而在Azure上进行更改后,我发现2个w3wp进程仍在并发运行-我确实验证了applicationhost.config更改已完成-请参阅下一条注释,其中不允许w3wp进程旋转,原因是我知道我的2个w3wp进程正在运行并发运行是因为我的日志文件在进行配置更改后出现间歇性错误。为了防止直接编辑.config文件不起作用,请参阅我使用XDT转换文件的编辑和链接示例:它可能是自动启动或预加载设置覆盖它。我可以在本地机器上复制它。如果您需要在关机时进行清理,并且您知道这将不到10秒,那么您可以在尝试打开信号灯之前在启动时进行休眠-System.Threading.Thread.Sleep10000;