![](/img/trans.png)
[英]Xamarin Authentifiication Facebook & google with IdentityModel.OidcClient not working
[英]Task.Delay in Dispose method of LoopbackListener in IdentityModel.OidcClient
我正在使用IdentityModel.OidcClient 的 SystemBrowser通过浏览器在控制台应用程序中请求令牌。 我不明白的是,为什么LoopbackHttpListener
的Dispose
方法中有一个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 client
或Update 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.