.net 无法在一天中的特定时间连接到Web服务器
我正在尝试使用WinForm中的.Net代码读取网页内容。直到最近,我才开始收到下面的连接失败错误 由于连接方在一段时间后没有正确响应,连接尝试失败;或者由于连接的主机未能响应,建立的连接失败 现在,在进一步调查之后,我发现代码驱动调用的错误只在一天中的特定时间出现;从上午9点到下午12点左右。但是,在此期间,从任何浏览器触发的URL调用都会返回正确的响应。IST下午12点后,代码驱动调用也开始工作 这已经在多个Windows环境中进行了测试——我的个人台式机、笔记本电脑、基于亚马逊云的VPS。在每一种情况下,ISP都是不同的 这使我认为服务器端可能有一个有时间限制的协议交换机,它在特定时间内不接受请求.net 无法在一天中的特定时间连接到Web服务器,.net,winforms,connection,httpwebrequest,webrequest,.net,Winforms,Connection,Httpwebrequest,Webrequest,我正在尝试使用WinForm中的.Net代码读取网页内容。直到最近,我才开始收到下面的连接失败错误 由于连接方在一段时间后没有正确响应,连接尝试失败;或者由于连接的主机未能响应,建立的连接失败 现在,在进一步调查之后,我发现代码驱动调用的错误只在一天中的特定时间出现;从上午9点到下午12点左右。但是,在此期间,从任何浏览器触发的URL调用都会返回正确的响应。IST下午12点后,代码驱动调用也开始工作 这已经在多个Windows环境中进行了测试——我的个人台式机、笔记本电脑、基于亚马逊云的VPS
Option Strict On
Imports System.IO
Imports System.Net
Public Class frmMain
Private Async Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
Await Task.Run(AddressOf StartProcessing)
End Sub
Private Async Function StartProcessing() As Task
Try
Dim responseCookies As New CookieContainer
Dim openPositionDataURL As String = "https://www.nseindia.com/live_market/dynaContent/live_watch/option_chain/optionKeys.jsp?symbolCode=-0&symbol=NIFTY&symbol=NIFTY&instrument=OPTIDX&date=-&segmentLink=17&segmentLink=17"
ServicePointManager.Expect100Continue = False
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
ServicePointManager.ServerCertificateValidationCallback = Function(s, Ca, CaC, sslPE)
Return True
End Function
Dim request As HttpWebRequest = WebRequest.CreateHttp(openPositionDataURL)
request.AllowAutoRedirect = True
request.AutomaticDecompression = DecompressionMethods.GZip Or DecompressionMethods.Deflate Or DecompressionMethods.None
request.Host = "www.nseindia.com"
request.KeepAlive = True
request.Headers.Add("Upgrade-Insecure-Requests", "1")
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko"
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
request.Headers.Add("Sec-Fetch-Site", "none")
request.Headers.Add("Sec-Fetch-Mode", "navigate")
request.Headers.Add("Accept-Encoding", "gzip, deflate, br")
request.Headers.Add("Accept-Language", "en-US,en;q=0.9,hi;q=0.8,ko;q=0.7")
request.CookieContainer = responseCookies
''request.ServicePoint.UseNagleAlgorithm = True
'request.ProtocolVersion = HttpVersion.Version10
'request.ServicePoint.ConnectionLimit = 12
'request.Proxy = Nothing
'request.ContentType = "application/x-www-form-urlencoded"
'request.Referer = "https://www.google.com/"
'request.Headers.Add("Sec-Fetch-User", "?1")
'request.ConnectionGroupName = Guid.NewGuid().ToString()
'request.Timeout = -1
Using wr As WebResponse = Await request.GetResponseAsync()
Using sr = New StreamReader(wr.GetResponseStream)
Console.WriteLine("URL Response")
End Using
End Using
Catch ex As Exception
Console.WriteLine(ex.Message)
Throw ex
End Try
End Function
End Class
注释掉的代码是我在SO中搜索类似问题后尝试添加的代码
以下是Wireshark从浏览器中被点击时的转储,与从代码中被点击时的转储
我怎样才能在上述两个时间段内实现这一点呢?正如Jimi所建议的那样,将以下内容更改为基于IE的最新UA实现了这一点 更改了我使用的UA
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
到
开始设置
选项Strict On
+您有一个异步方法,但没有唤醒任何东西,所以更改这行:使用sr=newstreamreader(request.GetResponseAsync().Result.GetResponseStream)
这是完全错误的使用服务器所需的安全协议(TLS1.2)。+<代码>接受编码gzip(…)需要添加一个CookieContainer
+使用IE11User Agent
标题(这是有原因的)。这就是的原因。结果用于等待响应,然后返回响应。使用wait调用函数
StartProcessing。我看这里没有什么问题。正如我所说的,代码在一天中的特定时间后工作正常。如果代码根本不起作用,您上面提到的所有内容都会产生影响。链接到result vs wait in,因此使用。result
是一个阻塞调用。您永远不会阻止异步方法请求。我不知道一天中的时间
问题,我从未见过。我可以告诉你我在这里看到的代码有什么问题。时间问题可能与cookies有关<默认情况下,“代码>自动压缩”处于关闭状态。拥有那个Accept Encoding
头,意味着您正在接收一个压缩流,您必须手动解压缩:我看不出在哪里会发生这种情况。等等。根据你的建议编辑了问题。问题仍然存在。为了澄清,我建议更改用户代理
标题,因为较新的用户代理
可能会导致服务器激活(服务器可能会激活或不激活HST)。该服务器没有处于活动状态(我发现它已禁用)。但是负载平衡器可能会改变这种情况。发生这种情况时,服务器期望与WebBrowser进行某种形式的交互,并等待响应。HttpWebRequest不支持它,将等待服务器响应,直到超时停止无聊的聚会。(我已经从这里删除了一个补充问题,因为我怀疑你正在演讲的聚会没有看到它。无论如何,这种讨论最好在评论中完成,如果足够的话,可能是一个新问题。谢谢!).
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko"