目前,我有一个.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个报告。
有什么想法吗?
答案 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代理将尝试从登录用户收集凭据,但不会发现任何内容。然后该请求将被拒绝。这就是为什么任何用户登录都工作但每次都失败的原因。