我有一个 Windows 服务,它将在 OnShutdown
和 OnStop
中发送一个 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/