我已经决定修改这个问题,因为它在经历了数小时的挫折之后是一件急事。 对所有浪费时间的事情表示歉意。
拓扑: 两种截然不同的应用。 1. WPF应用程序C#。包括DevExpress工具,SignalR,Web API的AutoRest实现。 ADAL认证。 2.驻留在Azure上的Webapi ASP.NET,最近已升级到.net版本4.6.1(发布错误)。我也通过标题使用版本控制。 3.Azure SQL Server作为后端。最近将DTU(内存,CPU等)从10升级到20。(发布错误)
系统已经成功运行了大约三年,并且在此期间进行了大量开发工作。
几天没有发布任何内容,星期一早晨到了,错误开始出现。 我通过NLog将所有错误记录到SQL Server。
第一个错误:(到目前为止,我得到的最多)
System.Net.Http.HttpRequestException: Error while copying content to a stream. ---> System.IO.IOException: The decryption operation failed, see inner exception. ---> System.ComponentModel.Win32Exception: The specified data could not be decrypted
然后我开始看到
System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
--- End of inner exception stack trace ---
此错误的发生频率较低,但昨天发生了8次。
我也看到了这个错误,今天我开始认为这可能是主要原因。我认为我的ADAL通话效果很好,所以我会仔细查看。
Microsoft.Rest.HttpOperationException: Operation returned an invalid status code 'Unauthorized'
错误随机出现,您可以绕过它们,然后系统继续工作。经常需要刷新数据。
此后,我从稳定的早期版本重建了api,并添加了此后创建的一些调用。 我昨天重建了WPF应用程序,然后得到了相同的结果。
所以我开始认为这是Azure上的基础结构。
我在SQL Server上升级了DTU(这是必需的)。
我将API Web服务计划升级到下一个级别。
我通过Azure将api上的最小TLS设置为1.2。 api代码没有任何变化,我只是对TLS的工作方式一无所知。
我现在具有在Azure上运行的应用程序见解,以查看Web api的运行方式,并查看是否可以发现任何东西。
今天早上我仍然看到错误。 漫长的一周!
答案 0 :(得分:2)
我会根据您提到的错误尝试为您提供帮助。我在遇到同样的错误:
发送请求时发生错误。 ---> System.Net.WebException:请求被中止:无法创建 SSL / TLS安全通道。
考虑到您没有提供代码,我不确定这是否是同一问题,但是基于错误,我建议尝试以下操作:
在您的Global.asax
文件中,直接在Application_Start
方法中添加以下行:
ServicePointManager.SecurityProtocol =
((IEnumerable<SecurityProtocolType>)ConfigurationManager
.AppSettings["SecurityProtocol"]
.Split(',')
.Select(a => (SecurityProtocolType)Enum.Parse(typeof(SecurityProtocolType), a)))
.Aggregate<SecurityProtocolType, SecurityProtocolType>(0, (current, item) => current | (SecurityProtocolType)item);
并在您的Web.config
中:
<add key="SecurityProtocol" value="Tls12" />
在<appSettings>
部分中。
这是另一个提到的SecurityProtocol错误,建议您here进行很好的讨论。
答案 1 :(得分:0)
大多数情况下,我会非常粗略地调试这些问题。在运行您的应用的服务器上打开浏览器。转到您要点击的网址。评估URL的锁定/不受信任的部分,然后查看显示的证书。 98%的时间就是所需要的。对于另外2%,Wireshark是您的朋友。它将显示TLS协商的详细信息。您的服务器和远程服务器可能没有共同的密码,您可以在日志中看到。您还可以使用nmap从远程服务器获取密码列表,并将其与注册表中启用的密码进行比较
答案 2 :(得分:0)
我觉得这是tls不匹配的问题。可能其中一个系统开始要求tls 1.2,而您的应用程序未发送它。 您不是很确切地知道错误的出处,是在webapi和sql db之间还是在wpf和webapi之间,
假设它在wpf和webapi之间, 打开一个powershell, 类型[Net.ServicePointManager] :: SecurityProtocol 然后看你在那里看到的, 然后在powershell中运行,这将为4.7以下的.net版本设置默认值,以始终强制tls1.2连接
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
然后重新启动powershell并再次执行[Net.ServicePointManager] :: SecurityProtocol以确保它也在那里显示Tls12。
或在您的代码中手动设置它,但是我会首先在您的wpf侧计算机上运行它以测试是否是问题所在。