Vb.net 从服务器上的计划任务运行时出现HttpWebRequest.GetResponse超时问题
目前,我有一个.NET应用程序,可以使用其API登录SalesForce。从这里,我查询一个对象以获取报告信息并构建一个URL,该URL将向我导出一个文件。代码是这样的Vb.net 从服务器上的计划任务运行时出现HttpWebRequest.GetResponse超时问题,vb.net,salesforce,httpwebrequest,scheduled-tasks,Vb.net,Salesforce,Httpwebrequest,Scheduled Tasks,目前,我有一个.NET应用程序,可以使用其API登录SalesForce。从这里,我查询一个对象以获取报告信息并构建一个URL,该URL将向我导出一个文件。代码是这样的 Dim request As HttpWebRequest Dim response As HttpWebResponse Dim stream as Stream request = CType(WebRequest.Create(URL), HttpWebRequest) request.Method = "GET" req
Dim request As HttpWebRequest
Dim response As HttpWebResponse
Dim stream as Stream
request = CType(WebRequest.Create(URL), HttpWebRequest)
request.Method = "GET"
request.Headers.Add("Cookie", "sid=" & header.sessionId)
response = CType(request.GetResponse(), HttpWebResponse)
stream = response.GetResponseStream()
上面的My header.sessionId是SalesForce会话头,它捕获我的会话以便成功登录
在本地测试或在Visual Studio 2010的生产服务器上运行时,此应用程序可以成功运行。我已将其设置为作为导致问题的计划任务运行。任务设置为作为服务器上的管理员帐户运行,如果在运行期间手动右键单击任务->运行或保持与服务器的连接,则该任务可以运行。如果断开与服务器的连接并运行任务,则会出现System.Net.WebException:操作每次都在System.Net.HttpWebRequest.GetResponse错误处超时。然后手动登录并关闭应用程序
如上所述,这是设置为运行作为一个管理员帐户,我已经给了该帐户完全控制的安全性。我没有将“仅在登录时运行”设置为选中,也没有将其设置为“仅在空闲时运行”
据我所知,web请求的默认超时是100000毫秒或100秒。此任务在达到该限制之前获得超时。在显示代码之前,我检查确认我的会话仍然有效,如果无效,请续订会话。此超时总是发生在尝试下载的第一份报告上,但手动运行时,我可以在2分钟内下载大约25份报告
有什么想法吗?这不是答案,但我创建了一个相当粗糙的HttpWebRequest测试应用程序,并将其设置为以另一个未登录Windows 7的用户的身份运行。对不起,我没有访问atm服务器的权限。我试过的每一种测试方法都完美无瑕。也许是因为Windows7的功能与你想让它工作的操作系统不同?或者可能是代码中的某些内容导致了问题。既然这段代码对我有效,我建议您尝试一下,至少消除代码的问题 创建一个新的vb.net应用程序,确保删除所有表单并创建模块Module1,并在其中插入以下代码:
Imports System.Net
Imports System.IO
Module Module1
Const sUserAgent As String = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0"
Const sMainURL As String = "http://www.stackoverflow.com/"
Private gsLogFile As String = System.IO.Path.Combine(Application.StartupPath, "logfile.txt")
Sub Main()
StartScrape()
End Sub
Private Sub StartScrape()
Try
GetMethod(sMainURL)
SaveTextToFile("Finished", gsLogFile)
Catch ex As Exception
SaveTextToFile("Error: " & ex.Message, gsLogFile)
End Try
End Sub
Private Function GetMethod(ByVal sPage As String) As Boolean
Dim req As HttpWebRequest
Dim resp As HttpWebResponse
Dim stw As StreamReader
Dim bReturn As Boolean = True
Try
req = HttpWebRequest.Create(sPage)
req.Method = "GET"
req.AllowAutoRedirect = False
req.UserAgent = sUserAgent
req.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"
req.Headers.Add("Accept-Language", "en-us,en;q=0.5")
req.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7")
req.Headers.Add("Keep-Alive", "300")
resp = req.GetResponse ' Get the response from the server
If req.HaveResponse Then
resp = req.GetResponse ' Get the response from the server
stw = New StreamReader(resp.GetResponseStream)
stw.ReadToEnd() ' Read the response from the server, but we do not save it
Else
SaveTextToFile("No response received from host " & sPage, gsLogFile)
bReturn = False
End If
Catch exc As WebException
SaveTextToFile("Network Error: " & exc.Message.ToString & " Status Code: " & exc.Status.ToString & " from " & sPage, gsLogFile)
bReturn = False
End Try
Return bReturn
End Function
Public Function SaveTextToFile(ByVal strData As String, ByVal FullPath As String) As Boolean
Dim bAns As Boolean = False
Dim objReader As IO.StreamWriter
Try
objReader = New IO.StreamWriter(FullPath, System.IO.File.Exists(FullPath))
objReader.Write(Format(Now, "dd-MMM-yyyy hh:mm:ss tt") & " - " & strData)
objReader.Close()
bAns = True
Catch Ex As Exception
End Try
Return bAns
End Function
End Module
日志文件logfile.txt完成后将在与exe相同的目录中创建。如果有错误,它将被记录到文件中,并在最后用时间戳显示Finished。我在TaskScheduler中使用不同的选项以几种不同的方式运行它,每次只有一个日志条目显示Finished。如果您决定测试此项,请报告您的结果,如果此测试失败,我肯定会说您的计划任务有问题。根据我之前的评论,似乎涉及到一个代理,要求用户登录以使请求成功 你的答复: 我们使用internet安全web代理,该代理通过用户的单点登录工作。基本上,在允许或阻止流量之前,当用户尝试在后台访问站点时,该工具会拉取用户的网络凭据。问题是,一旦管理员帐户断开连接,此web代理将尝试从登录的用户收集凭据,但找不到任何内容。然后,请求将被拒绝。这就是为什么任何正在登录的用户都可以工作,但每隔一次都会失败
... 您是否尝试过扩展超时?我尝试过多个不同的超时,在所有情况下,超时都发生在达到限制之前。等等,当您没有达到超时时,它会给您一个超时错误?可能需要添加一个keep-alive.KeepAlive的默认值为True。不过我会尝试将其添加到中。我不知道这是否是问题所在,但在执行此类工作时,我总是添加一个keep-alive值300:request.Headers.AddKeep-alive,300。您是否也尝试过使用像Telerik Fiddler这样的web调试代理来查看服务器上实际发生了什么?明天我将对此进行讨论。我已将请求抛出一段时间,重试bool=False。如果捕获到超时,则设置retry=True并增加计数器。在第三次失败时,我接受超时并向自己发送一封错误电子邮件。我用数字记录每个故障,并用时间和日期戳记录最终故障。将使用我的更改和日志文件转储编辑我的原始帖子。