.net 无法在一天中的特定时间连接到Web服务器

.net 无法在一天中的特定时间连接到Web服务器,.net,winforms,connection,httpwebrequest,webrequest,.net,Winforms,Connection,Httpwebrequest,Webrequest,我正在尝试使用WinForm中的.Net代码读取网页内容。直到最近,我才开始收到下面的连接失败错误 由于连接方在一段时间后没有正确响应,连接尝试失败;或者由于连接的主机未能响应,建立的连接失败 现在,在进一步调查之后,我发现代码驱动调用的错误只在一天中的特定时间出现;从上午9点到下午12点左右。但是,在此期间,从任何浏览器触发的URL调用都会返回正确的响应。IST下午12点后,代码驱动调用也开始工作 这已经在多个Windows环境中进行了测试——我的个人台式机、笔记本电脑、基于亚马逊云的VPS

我正在尝试使用WinForm中的.Net代码读取网页内容。直到最近,我才开始收到下面的连接失败错误

由于连接方在一段时间后没有正确响应,连接尝试失败;或者由于连接的主机未能响应,建立的连接失败

现在,在进一步调查之后,我发现代码驱动调用的错误只在一天中的特定时间出现;从上午9点到下午12点左右。但是,在此期间,从任何浏览器触发的URL调用都会返回正确的响应。IST下午12点后,代码驱动调用也开始工作

这已经在多个Windows环境中进行了测试——我的个人台式机、笔记本电脑、基于亚马逊云的VPS。在每一种情况下,ISP都是不同的

这使我认为服务器端可能有一个有时间限制的协议交换机,它在特定时间内不接受请求

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
+使用IE11
User 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"