2015-01-29 5 views
0

현재 .NET 응용 프로그램에 해당 API를 사용하여 SalesForce에 로그인했습니다. 여기에서 개체를 쿼리하여 보고서 정보를 가져오고 파일을 내보내는 URL을 작성합니다. 코드가 그대로입니다.HttpWebRequest.GetResponse 서버의 예약 된 작업에서 실행 중 시간 초과 문제

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 세션 헤더입니다.

이 응용 프로그램은 로컬에서 테스트하거나 프로덕션 서버 (Visual Studio 2010에서 실행)에서 성공적으로 작동합니다. 문제를 일으키는 예약 된 작업으로 실행되도록 설정했습니다. 이 작업은 서버에서 관리자 계정으로 실행되도록 설정되어 있으며 수동으로 시작 (작업 -> 실행을 마우스 오른쪽 단추로 클릭)하거나 실행 중에 서버에 연결되어 있으면 작동합니다. 서버에서 연결이 끊어지고 작업이 실행되면 "System.Net.WebException : 작업이 System.Net.HttpWebRequest.GetResponse()"시간마다 오류가 발생합니다. 로그인하고 응용 프로그램을 수동으로 시작하면 작동합니다.

앞에서 설명했듯이이 계정은 관리자 계정으로 실행되도록 설정되어 있으며 보안을 위해 계정을 완전히 제어합니다. 나는 "로그인 한 경우에만 실행"을 선택하지 않았으며 유휴 상태 일 때만 실행하도록 설정하지 않았습니다.

내가 아는 바로는 웹 요청의 기본 제한 시간은 100,000ms 또는 100 초입니다. 이 작업은 한계에 도달하기 전에 시간 초과를 가져옵니다. 표시된 코드 바로 앞에, 나는 세션이 유효하다는 것을 확인하고 그렇지 않은 경우 세션을 갱신합니다. 이 시간 제한은 다운로드하려는 첫 번째 보고서에서 항상 발생하지만 수동으로 실행하면 2 분 이내에 25 개의 보고서를 다운로드 할 수 있습니다.

아이디어가 있으십니까?

+0

... 제한 시간을 연장 해 보셨습니까? – Kat

+0

여러 시간 초과를 시도했지만 모든 경우에 한도에 도달하기 전에 시간 초과가 발생합니다. – Trizz

+0

잠깐만 기다려주십시오. 시간 초과에 도달하지 못하면 시간 초과 오류가 발생합니까? 어쩌면 계속 살아 있어야 할 것입니다. – Kat

답변

0

필자의 이전 의견에 따르면, 성공을 요구하기 위해 사용자가 로그인해야하는 프록시가있는 것처럼 보입니다.

귀하의 응답 :

우리는 사용자를위한 단일 사인온을 통해 작동하는 인터넷 보안 웹 프록시를 사용합니다. 기본적으로이 도구는 트래픽을 허용하거나 차단하기 전에 사용자가 시도하거나 사이트 뒤에서 사이트에 액세스 할 때마다 사용자 네트워크 자격 증명을 가져옵니다.문제는 일단 관리자 계정의 연결이 끊어지면이 웹 프록시는 로그인 한 사용자로부터 자격 증명을 수집하려고 시도하지만 아무것도 찾을 수 없습니다. 그런 다음 요청이 거부됩니다. 이것이 로그인 된 모든 사용자가 작동하지만 다른 시간에 실패한 이유입니다.

0

이것은 "대답"이 아니지만 다소 어색한 HttpWebRequest 테스트 응용 프로그램을 만들고 Windows 7에 로그인하지 않은 다른 사용자로 실행하도록 설정했습니다. (죄송합니다. atm 서버에 액세스 할 수 없습니다.). 테스트는 내가 시도한 모든면에서 완벽하게 작동했습니다. 어쩌면 Windows 7이 (운영 체제에서이 작업을 수행하려고 시도하고있는 것보다) 다른 방식으로 작업을 수행했기 때문일 수도 있고, 실제로 코드에서 문제의 원인이 될 수도 있습니다. 이 코드가 저에게 효과적 이었기 때문에 여러분이 코드를 시도해보고 문제가되는 코드를 제거하는 것이 좋습니다.

거기에이 코드를 새로운 vb.net 응용 프로그램을 작성하고 모든 형태를 제거 할 수 있는지 확인하고 모듈 (Module1의)를 만들고 때리고 :

로그 파일 logfile.txt은 같은 디렉토리에 생성됩니다
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 

완료 될 때 exe로. 오류가 있으면 파일에 기록되고 결국에는 시간 소인으로 "Finished"라고 표시됩니다. 작업 스케줄러에서 여러 옵션을 사용하여 여러 가지 방법으로 실행했으며 "완료"라는 로그 항목이 하나씩있을 때마다 실행했습니다. 이 테스트를 실패한 것처럼 테스트하려고 결정한 경우 결과를보고하십시오. 예약 된 태스크에 문제가 있다고 분명히 말합니다.

+0

나는 내일이 스윙을 줄 것이다. 나는 재시도 bool =을 사용하여 While에 요청을 던졌습니다. 내가 타임 아웃을 잡으면 재시도 = True로 설정하고 카운터를 늘리십시오. 세 번째 오류에서 나는 타임 아웃을 받아들이고 오류 이메일을 보낸다. 나는 각 실패 (숫자와 함께)뿐만 아니라 시간과 날짜 스탬프와 최종 실패를 기록합니다. 변경 사항 및 로그 파일 덤프로 원래 게시물을 편집합니다. – Trizz