Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 从服务器上的计划任务运行时出现HttpWebRequest.GetResponse超时问题_Vb.net_Salesforce_Httpwebrequest_Scheduled Tasks - Fatal编程技术网

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

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

目前,我有一个.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"
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并增加计数器。在第三次失败时,我接受超时并向自己发送一封错误电子邮件。我用数字记录每个故障,并用时间和日期戳记录最终故障。将使用我的更改和日志文件转储编辑我的原始帖子。