【发布时间】:2014-11-18 16:06:06
【问题描述】:
我将 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 中间件,该中间件将跟踪当前正在处理的请求并将停止操作推迟到一切完成。中间件还会在停止阶段短路所有请求。但这个解决方案对我来说并不好。
【问题讨论】:
-
对我来说听起来是个好主意。我认为您需要 something 来缩短新请求,并且在管道中放置一些东西似乎是正确的地方。对于跟踪请求,您可以在请求开始和结束时使用基本的
Interlocked.Increment/Decrement计数器,以便您知道最后一个请求何时完成。
标签: c# .net owin self-hosting katana