繁体   English   中英

IdentityModel.OidcClient 中 LoopbackListener 的 Dispose 方法中的 Task.Delay

[英]Task.Delay in Dispose method of LoopbackListener in IdentityModel.OidcClient

我正在使用IdentityModel.OidcClient 的 SystemBrowser通过浏览器在控制台应用程序中请求令牌。 我不明白的是,为什么LoopbackHttpListenerDispose方法中有一个await Task.Delay(500) 我明白您为什么要通过 Task.Run 执行 Dispose,而不是延迟。

GitHub 中的代码行: https://github.com/IdentityModel/IdentityModel.OidcClient/blob/46d7b25cd71eb0be5f3c203c2525b1f357e408dbBrowserclients.

    public LoopbackHttpListener(int port, string path = null)
    {
        path = path ?? String.Empty;
        if (path.StartsWith("/")) path = path.Substring(1);

        _url = $"http://127.0.0.1:{port}/{path}";

        _host = new WebHostBuilder()
            .UseKestrel()
            .UseUrls(_url)
            .Configure(Configure)
            .Build();
        _host.Start();
    }

    public void Dispose()
    {
        Task.Run(async () =>
        {
            await Task.Delay(500);
            _host.Dispose();
        });
    }

我不知道为什么使用该代码,但我可以猜到。 这只能由维护者来回答,假设他们仍然记得为什么在 6 年后写这篇文章。

点击Blame显示这条特定的行已有 6 年历史,标记为hacky dispose of Kestrel 最近的提交有Update test clientUpdate sample client之类的消息。 csproj文件直接针对 .NET 6。 如果这是库代码,它将针对 .NET 标准 2.1 或 .NET Core 3.1,它们仍然受支持。

我的猜测是,此代码用于确保侦听器处理的任何未决请求在关闭之前完成。 由于这是作为测试代码开始的,因此使用了一些 hack 并且从未修复,因为它们不会直接影响测试或示例的核心行为。

我不记得 WebHost 或 Generic Host 在 2017 年回顾了什么(我懒得去查了)。 .NET Standard 2.0、.NET Core 3.1 和 .NET 6 之间的接口发生了很大变化。

在 .NET 6 虽然我们可以使用IAsyncDisposable来允许异步处理。 DisposeAsync ,我们可以调用WebHost.StopAsync以在处理主机之前正常关闭主机:

public class LoopbackHttpListener : IAsyncDisposable
{

...
    public async ValueTask DisposeAsync()
    {
        await _host.StopAsync(TimeSpan.FromMilliseconds(500));
        _host.Dispose();
    }

LoopbackHttpListener也有可能被Minimal API替换。

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", (HttpRequest request) =>{
    _source.TrySetResult(request.QueryString);
    return "<h1>You can now return to the application.</h1>";
});

_task=app.RunAsync(_url);

测试代码在任何 HTTP GET 调用上返回固定响应,并通过_source TaskCompletionSource 公开请求的查询字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM