c# – 当自托管OWIN服务器关闭时,如何向Web API操作发出取消信号?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 当自托管OWIN服务器关闭时,如何向Web API操作发出取消信号?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2079字,纯文字阅读大概需要3分钟。
内容图文
![c# – 当自托管OWIN服务器关闭时,如何向Web API操作发出取消信号?](/upload/InfoBanner/zyjiaocheng/811/c951547423064969aecd6dc82a9f3a25.jpg)
我有一个在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的内置请求取消功能,如果客户端取消请求,则会发出令牌信号并且_dataSource会相应地处理它并抛出OperationCanceledException.
到目前为止,太棒了.
但是当我的主机进程终止时(即Windows服务停止),不会发出令牌信号,并且取消和纾困过程不是优雅的.
我知道OWIN环境字典的host.onAppDisposing属性,我已经挖掘了Microsoft.Owin [.*]和Microsoft.AspNet.WebApi.*包的源代码,试图找出GetSomeDataAsync的令牌参数在哪里来自,但我不知道如何将各个部分连接在一起.
我想做点什么
class WebServiceInAWindowsService : ServiceBase
{
private readonly CancellationTokenSource _cts = new CancellationTokenSource();
...
protected override void OnStop()
{
_cts.Cancel();
}
}
但是我不确定如何让_cts成为取消行动的源头,同时不会破坏运行良好的请求取消功能.
我认为CancellationTokenSource.CreateLinkedTokenSource()可能会有用,但我没有看到如何将各个部分组合在一起.
你能帮我吗?谢谢!
解决方法:
从WebApp.Start返回的值调用Dispose时会触发host.onAppDisposing.
默认情况下,GetSomeDataAsync仅与请求断开连接令牌相关联(例如owin.CallCancelled).通过中间件或其他方式,您可以将其替换为也连接到host.onAppDisposing的链接TCS.
就像是:
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操作发出取消信号?全部内容,希望文章能够帮你解决c# – 当自托管OWIN服务器关闭时,如何向Web API操作发出取消信号?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。