我正在尝试通过OidcClient库从IdentityServer注销,但是现在的解决方案要求我有一个空对话框,该对话框在退出前会弹出5秒钟。这非常丑陋,必须有更好的方法来实现。
在用于阻止表单弹出的official example中,使用了“ BeforeNavigate2”事件,但是如果不包括某些COM导入并扩展WebBrowser控件(如here所示,则该事件不可用)我也想避免。
我已经尝试用信号灯替换ShowDialog,但是如果我等待它,则会出现死锁,因为等待线程与应该触发“ Navigated”事件的线程相同。 我还尝试用HttpClient替换浏览器的导航,但后来我失去了WebBrowser已经处理的重定向和cookie删除功能
这是我的代码:
public override Task<BrowserResult> InvokeAsync(BrowserOptions options) {
BrowserResult result = null;
var t = new Thread(() => result = Run());
//needed because the browser UserControl will throw an exception if not inside a STA thread
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
return System.Threading.Tasks.Task.FromResult(result);
}
private BrowserResult Run(){
form = new Form { Name = "WebAuthentication", Text = formCaption, Width =
formWidth, Height = formHeight, ShowIcon = false };
browser = new WebBrowser { Dock = DockStyle.Fill };
form.Controls.Add(browser);
browser.Navigated += (sender, args) => {
form.Close();
};
browser.Navigate(options.StartUrl);
form.ShowDialog();
return new BrowserResult { ResultType = BrowserResultType.Success };
}
我在这里要做的是使用ShowDialog阻止执行,直到Web请求被完全填充而没有阻塞线程,然后使用form.Close()释放它。
理想情况下,注销时间不会超过几秒钟,并且不会弹出任何窗口。
任何帮助表示赞赏。