从服务器上的计划任务运行时的HttpWebRequest.GetResponse超时问题

时间:2015-01-29 17:42:10

标签: vb.net salesforce httpwebrequest scheduled-tasks

目前,我有一个.NET应用程序,使用他们的API将日志记录到SalesForce中。从这里我查询一个对象来提取报告信息并构建一个将导出文件的URL。代码是这样的。

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()

我上面的header.sessionId是SalesForce Session Header,它捕获我的会话以成功登录。

此应用程序在本地测试或在生产服务器上运行时(在Visual Studio 2010中)可以成功运行。我已将此设置为作为导致问题的计划任务运行。该任务设置为在服务器上作为管理员帐户运行,如果在运行时手动启动(右键单击任务 - >运行)或保持连接到服务器,则可以正常运行。如果我断开与服务器的连接并且任务运行,我得到一个" System.Net.WebException:该操作已在System.Net.HttpWebRequest.GetResponse()"每一次错误。手动登录并踢开应用程序然后工作。

如上所述,这设置为以管理员帐户运行,我已在帐户中完全控制了安全性。我没有"只有在登录后才能运行"检查,我也没有将它设置为仅在空闲时运行。

据我所知,Web请求的默认超时为100,000毫秒或100秒。此任务在达到该限制之前就会超时。就在显​​示的代码之前,我检查确认我的会话仍然有效,如果不是,则更新我的会话。此超时始终发生在尝试下载的第一个报告上,但在手动运行时,我可以在2分钟内下载大约25个报告。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

这不是答案"但我创建了一个相当粗糙的HttpWebRequest测试应用程序,并将其设置为另一个未登录Windows 7的用户运行(抱歉,我无法访问服务器atm)。我尝试过的每一种方式都完美地完成了测试。也许是因为Windows 7的工作方式不同(你试图使用哪个操作系统?)或者实际上你的代码中存在导致问题的东西。由于这段代码对我有用,我建议你尝试一下,至少要把代码作为问题来消除。

创建一个新的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相同的目录中创建。如果有错误,它将被记录到文件中,最后它会说"已完成"带有时间戳。我在任务调度程序中使用不同的选项以不同的方式运行它,每次我只有一个日志条目,表示"已完成"。如果您决定对此测试失败进行测试,请报告您的结果我肯定会说您的计划任务有问题。

答案 1 :(得分:0)

根据我之前的评论,似乎涉及一个代理,需要用户登录才能使请求成功。

您的回复:

  

我们使用互联网安全网络代理,通过单点登录为用户工作。基本上,该工具在允许或阻止流量之前,在他们尝试访问站点后立即获取用户网络凭据。问题是,一旦管理员帐户断开连接,此Web代理将尝试从登录用户收集凭据,但不会发现任何内容。然后该请求将被拒绝。这就是为什么任何用户登录都工作但每次都失败的原因。