在我的基于ASP.net的网站上,我正在从几个网站汇总我的活动的源。其中一个是https://github.com/lucamauri.atom
的GitHub供稿:这是一个有效的供稿,可以使用网络浏览器正确阅读,并且几周前它在我的网站上正常运行。从那以后,它开始产生错误
在我首先创建的代码和XMLReader
然后我将它加载到SyndicationFeed
对象中,如下所示:
Dim TempReader As System.Xml.XmlReader = System.Xml.XmlReader.Create(TempString)
Dim SyndFeed As SyndicationFeed = SyndicationFeed.Load(TempReader)
Dim TempItems As New List(Of SyndicationItem)
TempItems.AddRange(SyndFeed.Items.ToList.GetRange(0, Math.Min(CurrentFeed.TotalElements, SyndFeed.Items.Count)))
这适用于多个提要,但GitHub现在在上面代码的第一行生成TLS错误:
System.Net.WebException:请求已中止:无法创建SSL / TLS安全通道。 System.Net.HttpWebRequest.GetResponse()处于System.Xml.XmlDownloadManager.GetNonFileStream(Uri uri,ICredentials凭据,IWebProxy代理,RequestCachePolicy cachePolicy) 在System.Xml.XmlDownloadManager.GetStream(Uri uri,ICredentials凭据,IWebProxy代理,RequestCachePolicy cachePolicy) 在System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri,String role,Type ofObjectToReturn) 在System.Xml.XmlTextRemplImpl.FinishInitUriString()中的System.Xml.XmlTextReaderImpl..ctor(String uriStr,XmlReaderSettings设置,XmlParserContext上下文,XmlResolver uriResolver) 在System.Xml.XmlReaderSettings.CreateReader(String inputUri,XmlParserContext inputContext) 在System.Xml.XmlReader.Create(String inputUri,XmlReaderSettings设置,XmlParserContext inputContext) 在System.Xml.XmlReader.Create(String inputUri)
我使用相同的代码与其他HTTPS提要(https://stackoverflow.com/feeds/user/69295
只是命名一个),我没有得到错误。所以这是GitHub提要的特定内容,但是我可以再次从我运行网站的同一台机器上的浏览器访问它,所以我迷失了它。
有关问题原因的任何想法?
服务器控制最终协商的协议。 Stackoverflow服务器只需要TLS v1,如下面的wireshark捕获中所示。此跟踪是在.Net框架版本4上完成的。
Github提要拒绝任何低于TLS v1.2的内容,因此在.Net 4.0上失败,因为该版本默认不可用。
如果在同一台计算机上安装了.Net 4.5+,则可以通过在ServicePointManager上设置SecurityProtocol来解决此问题。如果你不这样做,那么你根本无法提出请求。
您可以使用SecurityProtocol的数值而不是.Net 4上不可用的枚举值来执行此操作。
ServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType)
完成此操作后,您现在可以在.Net 4上协商TLS 1.2。但是,如果可以的话,只需升级到更新的框架版本即可轻松实现。
更新
有一个针对.Net 3.5的补丁:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
.NET 4.5.1
在mvc项目的启动类中设置它,xmlreader在https链接上工作,谢谢你们。