gpt4 book ai didi

c# - 停止自托管 owin 服务器时完成当前请求

转载 作者:太空狗 更新时间:2023-10-29 23:30:55 24 4
gpt4 key购买 nike

我将 OWIN 服务器作为控制台应用程序的一部分。你可以在这里看到主要方法:

class Program
{
public static ManualResetEventSlim StopSwitch = new ManualResetEventSlim();

static void Main(string[] args)
{
Console.CancelKeyPress += (s, a) =>
{
a.Cancel = true;
StopSwitch.Set();
};

using (WebApp.Start<Startup>("http://+:8080/"))
{
Console.WriteLine("Server is running...");
Console.WriteLine("Press CTRL+C to stop it.");
StopSwitch.Wait();
Console.WriteLine("Server is stopping...");
}

Console.ReadKey();
Console.WriteLine("Server stopped. Press any key to close app...");
}
}

当请求的处理时间稍微长一点,同时用户按下 CTRL+C 停止应用程序时,请求处理会立即停止并且不会发送响应。是否有可能改变这种行为?我想拒绝所有新请求,但要等到当前正在处理的请求完成,然后停止服务器。

我最初的想法是创建 OWIN 中间件,它将跟踪当前正在处理的请求并推迟停止操作,直到一切都完成。中间件还会在停止阶段短路所有请求。但是这个解决方案对我来说听起来不太好。

最佳答案

我以使用中间件的建议方法结束:

public class ShutDownMiddleware
{
private readonly Func<IDictionary<string, object>, Task> next;
private static int requestCount = 0;
private static bool shutDownStateOn = false;

public static void ShutDown()
{
shutDownStateOn = true;
}

public static int GetRequestCount()
{
return requestCount;
}

public ShutDownMiddleware(Func<IDictionary<string, object>, Task> next)
{
this.next = next;
}

public async Task Invoke(IDictionary<string, object> environment)
{
if (shutDownStateOn)
{
environment["owin.ResponseStatusCode"] = HttpStatusCode.ServiceUnavailable;
return;
}

Interlocked.Increment(ref requestCount);
try
{
await next.Invoke(environment);
}
finally
{
Interlocked.Decrement(ref requestCount);
}
}
}

这在管道中注册为第一个中间件,在程序的主要方法中我可以这样使用它:

public class Program
{
public static ManualResetEventSlim StopSwitch = new ManualResetEventSlim();

static void Main(string[] args)
{
Console.CancelKeyPress += (s, a) =>
{
a.Cancel = true;
StopSwitch.Set();
};

using (WebApp.Start<Startup>("http://+:8080/"))
{
Console.WriteLine("Server is running...");
Console.WriteLine("Press CTRL+C to stop it.");
StopSwitch.Wait();
Console.WriteLine("Server is stopping...");
ShutDownMiddleware.ShutDown();
while (ShutDownMiddleware.GetRequestCount() != 0)
{
Thread.Sleep(TimeSpan.FromSeconds(1));
}
}
}
}

我还发现了这个:https://katanaproject.codeplex.com/workitem/281他们正在谈论类似的方法。

关于c# - 停止自托管 owin 服务器时完成当前请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26012227/

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