C# 在IIS Express停止后停止npm任务/脚本

C# 在IIS Express停止后停止npm任务/脚本,c#,node.js,.net-core,npm-scripts,C#,Node.js,.net Core,Npm Scripts,所以这是一个有趣的例子。我有一个使用EntityFrameworkCore和VueJS的dotnetcore 3项目。正确的。在我的Startup.cs:Configure(app,env)中有一条语句,如下所示: app.UseSpa(spa=> { if(env.IsDevelopment()) spa.Options.SourcePath=“ClientApp”; 其他的 spa.Options.SourcePath=“dist”; if(env.IsDevelopment()) { Us

所以这是一个有趣的例子。我有一个使用EntityFrameworkCore和VueJS的dotnetcore 3项目。正确的。在我的
Startup.cs:Configure(app,env)
中有一条语句,如下所示:

app.UseSpa(spa=>
{
if(env.IsDevelopment())
spa.Options.SourcePath=“ClientApp”;
其他的
spa.Options.SourcePath=“dist”;
if(env.IsDevelopment())
{
UseVueCli(npmScript:“服务”,端口:4444,forceKill:true);
}
});
如您所见,我已手动将端口指定为
4444
,如果我没有这样做,应用程序将尝试在端口
8080
8080++
上运行,直到应用程序到达机器上的空闲端口。当您只运行一次应用程序,然后应用程序从未崩溃,或者Visual Studio从未崩溃,或者您必须停止调试代码以管理项目文件结构时,这是可以的。。你明白我的意思。。在开发过程中,你永远不会只发出一次命令就可以完成它。至少以我的经验是这样

但尽管如此,这是此安装程序假定您要执行的操作,因为它在IIS Express服务关闭时从不停止npm脚本,但它会尝试在同一本地主机端口上重新启动VueJS应用程序,这将确保与重新启动的应用程序的连接未正确建立,从而导致混乱。除非通过windows终端终止上一个npm脚本任务

所以我这里的问题是-当我停止IIS Express服务器时,有人知道如何停止脚本运行并终止使其保持活动状态的任务吗?老实说,这让我有点困惑:)

中间件类(如果有人感兴趣:)

#区域程序集VueClimidware,版本=3.1.0.0,区域性=中性,PublicKeyToken=null
//C:\Users\\.nuget\packages\vueclimiddleware\3.1.1\lib\netcoreapp3.1\vueclimiddleware.dll
#端区
使用Microsoft.AspNetCore.Builder;
使用Microsoft.AspNetCore.Routing;
使用Microsoft.AspNetCore.spa服务;
使用vueclimiddware;
命名空间VueClimidware
{
公共静态类VueCliMiddlewareExtensions
{
公共静态IEndpointConventionBuilder MapToVueCliProxy(此IEndpointRouteBuilder端点、字符串模式、SpaOptions选项、字符串npmScript=“serve”、int port=8080、ScriptRunnerType runner=ScriptRunnerType.Npm、字符串regex=“running at”、bool forceKill=false);
公共静态IEndpointConventionBuilder MapToVueCliProxy(此IEndpointRouteBuilder端点,字符串模式,字符串源路径,字符串npmScript=“serve”,int port=8080,ScriptRunnerType runner=ScriptRunnerType.Npm,字符串regex=“running at”,bool forceKill=false);
公共静态IEndpointConventionBuilder MapToVueCliProxy(此IEndpointRouteBuilder端点,SpaOptions选项,字符串npmScript=“serve”,int port=8080,ScriptRunnerType runner=ScriptRunnerType.Npm,字符串regex=“running at”,bool forceKill=false);
公共静态IEndpointConventionBuilder MapToVueCliProxy(此IEndpointRouteBuilder端点,字符串sourcePath,字符串npmScript=“serve”,int port=8080,ScriptRunnerType runner=ScriptRunnerType.Npm,字符串regex=“running at”,bool forceKill=false);
公共静态void UseVueCli(此ISpaBuilder spaBuilder,字符串npmScript=“serve”,int port=8080,ScriptRunnerType runner=ScriptRunnerType.Npm,字符串regex=“running at”,bool forceKill=false);
}
}

好的,免责声明:这是一个完全的黑客攻击,只有在您事先知道您的端口(至少,它在我的机器上工作;)时才有效,需要大量的重构,我不提供任何保证

很少有人知道,在Startup类中,您可以非常轻松地附加到应用程序生命周期:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        lifetime.ApplicationStopping.Register(OnStopping); // <== Magic is here!
    }
    // [Blah blah, yada yada, your super cool code here]
}

private void OnStopping()
{
    // Things to do before application is stopped
}
请让我知道你的想法,以及它是否适合你。

部分答案(有点)。从

以下是:

if (portNumber < 80)
{
  portNumber = TcpPortFinder.FindAvailablePort();
}
else
{
  // if the port we want to use is occupied, terminate the process utilizing that port.
  // this occurs when "stop" is used from the debugger and the middleware does not have the opportunity to kill the process
  PidUtils.KillPort((ushort)portNumber, forceKill);
}
if(端口号<80)
{
portNumber=TcpPortFinder.findavaailableport();
}
其他的
{
//如果要使用的端口已被占用,请终止使用该端口的进程。
//当调试器使用“stop”并且中间件没有机会终止进程时,就会发生这种情况
PidUtils.KillPort((ushort)端口号,forceKill);
}

您可以在本地构建它,然后进行跟踪,查看它是否/为什么不能按预期工作。forceKill的全部目的似乎就是解决这个问题。

为什么不使用launchSettings.json文件来指定要在其上运行应用程序的端口?这是一个非常好的问题-我已经在lauch上指定了我的特定端口。但是如果我终止应用程序并重新启动它,nodejs服务器仍在运行,然后我的dotnetcore应用程序尝试再次运行
npm run service--port 4444
,但是该端口从上次dotnetcore运行该命令时起就被占用了,因为它没有停止npm应用程序,只有IIS Express上的dotnetcore应用程序会停止看来是这样。但这是什么时候被解雇的?在使用调试器时,按stop是在开发过程中停止应用程序的唯一方法吗?还是我弄错了?根据注释代码示例中的说明,即使强制终止正在使用my
4444
portnumber的进程,也会在应用程序再次启动而不是关闭时终止。我注意到,当我停止我的应用程序时,如果我不加载我的vue应用程序正在运行的页面,那么该进程将在某个时候终止。是否存在延迟或计时器计数来自浏览器或IIS的不活动?这将在运行应用程序时触发。它扼杀了一个竞争过程的启动,而不是关闭。不是一个Vue的家伙如此不确定为什么会做出这样的选择。正如你提到的,这可以说是一种“黑客行为”),但这个想法非常好。由于这是在windows上开发的,IIS和Visual Studio可以从代码中访问cmd命令:)我将接受它作为ans
if (portNumber < 80)
{
  portNumber = TcpPortFinder.FindAvailablePort();
}
else
{
  // if the port we want to use is occupied, terminate the process utilizing that port.
  // this occurs when "stop" is used from the debugger and the middleware does not have the opportunity to kill the process
  PidUtils.KillPort((ushort)portNumber, forceKill);
}