gpt4 book ai didi

c# - 当自托管 OWIN 服务器关闭时,如何向 Web API 操作发出取消信号?

转载 作者:太空狗 更新时间:2023-10-30 00:48:26 24 4
gpt4 key购买 nike

我在 Windows 服务中托管了一个基于 OWIN 的 ASP.NET Web API。我的大部分 ApiController 操作都是异步的,并且接受 CancellationToken 参数:

[Route("data/{id}")]
public async Task<IHttpActionResult> GetSomeDataAsync(int id, CancellationToken token)
{
try
{
using (var _dataSource = ...)
{
return Ok(await _dataSource.GetDataAsync(id, token));
}
}
catch (OperationCanceledException ex)
{
return StatusCode(HttpStatusCode.NoContent);
}
}

使用 Web API 的内置请求取消功能,如果客户端取消请求,token 会发出信号,_dataSource 会适本地处理它并抛出 OperationCanceledException.

到目前为止,太棒了。

但是当我的主机进程终止(即 Windows 服务停止)时,token 没有发出信号,取消和退出进程也没有优雅。

我知道 OWIN 环境字典的 host.onAppDisposing 属性,并且我已经深入研究了 Microsoft.Owin[.*] 和 < strong>Microsoft.AspNet.WebApi.* 包试图找出 GetSomeDataAsynctoken 参数来自哪里,但我不确定如何将各个部分连接在一起。

我想做这样的事

class WebServiceInAWindowsService : ServiceBase
{
private readonly CancellationTokenSource _cts = new CancellationTokenSource();
...
protected override void OnStop()
{
_cts.Cancel();
}
}

但我不确定如何让 _cts 成为 CancellationTokens 的来源,不会破坏 运行良好的请求取消功能。

我认为 CancellationTokenSource.CreateLinkedTokenSource() 可能会有用,但我不知道如何将各个部分组合在一起。

你能帮忙吗?谢谢!

最佳答案

host.onAppDisposing 在您对从 WebApp.Start 返回的值调用 Dispose 时触发。

https://github.com/aspnet/AspNetKatana/blob/9f6e09af6bf203744feb5347121fe25f6eec06d8/src/Microsoft.Owin.Hosting/Engine/HostingEngine.cs#L302-L308

https://github.com/aspnet/AspNetKatana/blob/9f6e09af6bf203744feb5347121fe25f6eec06d8/src/Microsoft.Owin.Hosting/Engine/HostingEngine.cs#L112

GetSomeDataAsync 默认情况下仅与请求断开连接 token 关联(例如 owin.CallCancelled)。通过中间件或其他方式,您可以将其替换为链接的 TCS,该 TCS 也连接到 host.onAppDisposing

类似于:

app.Use(async (env, next) =>
{
var reqAbt = env.Get<CancellationToken>("owin.CallCancelled");
var appAbt = env.Get<CancellationToken>("host.onAppDisposing");
using (linked = CancellationTokenSource.CreateLinkedTokenSource(reqAbt, appAbt))
{
env["owin.CallCancelled"] = linked.Token;
await next();
env["owin.CallCancelled"] = reqAbt;
}
});

关于c# - 当自托管 OWIN 服务器关闭时,如何向 Web API 操作发出取消信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46736444/

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