各种错误随机出现

时间:2020-05-20 17:51:35

标签: c# wpf https azure-active-directory webapi

我已经决定修改这个问题,因为它在经历了数小时的挫折之后是一件急事。 对所有浪费时间的事情表示歉意。

拓扑: 两种截然不同的应用。 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的运行方式,并查看是否可以发现任何东西。

今天早上我仍然看到错误。 漫长的一周!

3 个答案:

答案 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侧计算机上运行它以测试是否是问题所在。