c# - Http 请求在从 ServiceBase.OnShutdown 发送时中止,但在 OnStop 中未中止

标签 c# .net ssl https dotnet-httpclient

我有一个 Windows 服务,它将在 OnShutdownOnStop 中发送一个 https 请求,当我从任务管理器中重新启动该服务时,它工作正常。但是,当服务因服务器关闭而停止时,相同的代码将抛出此异常:

System.Net.Http.HttpRequestException:发送请求时出错。 ---> System.Net.WebException:请求被中止:无法创建 SSL/TLS 安全通道。 在 System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult、TransportContext& 上下文) 在 System.Net.Http.HttpClientHandler.GetRequestStreamCallback (IAsyncResult ar) --- 内部异常堆栈跟踪结束 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter1.GetResult()

此外,请求发生在更大的Task 中。

我不确定从任务管理器或服务停止服务与关闭 Windows 如何使相同的逻辑表现不同。什么可能导致此问题,或者我该如何解决?

最佳答案

我无法确定是在 Task.Run() 中是问题所在,还是其他原因可能导致此请求中止。但是,我能够通过使用 SystemEvents.SessionEnded 事件来防止它中止:

public void Start()
{
    SystemEvents.SessionEnded += OnSessionEnded;

...

public void Stop()
{
    SystemEvents.SessionEnded -= OnSessionEnded;

...

private void OnSessionEnded(object sender, SessionEndedEventArgs eventArgs)
{
    if (eventArgs.Reason == SessionEndReasons.SystemShutdown)
    {
        SendRequest();
    }
}

这是我的代码所做的简化版本。在 SessionEnded 触发时发送此 http 请求,而不是等待 ServiceBase.OnStop 被调用,允许请求成功完成。并且更改不会影响服务正常关闭的方式。我可以看到的主要区别是它现在发生在服务关闭过程的早期。

关于c# - Http 请求在从 ServiceBase.OnShutdown 发送时中止,但在 OnStop 中未中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47022938/

相关文章:

c# - 插入、删除和更新命令不是由适配器构建的

c# - CA1063 警告和覆盖处置困惑——不确定我是否应该抑制

c# - WCF 服务配置 : How can I access the AppSettings in code using C#

sockets - 使用 glib 进行 SSL 套接字编程

ssl - 使用 Nginx 的 Play Framework 2.3.x 中的 TLS 1.2 实现

email - SSL 签名如何以及在何处应用于电子邮件?

c# - 在 C# 中处理条件依赖的最佳方式是什么

c# - 遍历 LINQ 查询列(不是行)

c# - 删除C#.net中Infragistics UltraListView的所有项目

.net - 如何更改 Microsoft Chart Controls(柱状图)中的轴分隔线颜色