Vb.net HttpWebRequest在工作中失败
我正在尝试使用REST服务。下面是我的代码。此代码在家庭网络中运行良好,但在工作中失败 在工作时,它可以正常登录并返回会话id。但是,任何使用会话id的进一步调用都将挂起。请告诉我哪里出了问题。谢谢你的帮助Vb.net HttpWebRequest在工作中失败,vb.net,session,httpwebrequest,Vb.net,Session,Httpwebrequest,我正在尝试使用REST服务。下面是我的代码。此代码在家庭网络中运行良好,但在工作中失败 在工作时,它可以正常登录并返回会话id。但是,任何使用会话id的进一步调用都将挂起。请告诉我哪里出了问题。谢谢你的帮助 Public Shared Function login(username As String, instancename As String, password As String) 'Dim handler As New HttpClientHandler() 'hand
Public Shared Function login(username As String, instancename As String, password As String)
'Dim handler As New HttpClientHandler()
'handler.Proxy = New System.Net.WebProxy("proxy-test.com:8080")
'handler.Proxy.Credentials = CredentialCache.DefaultCredentials
'handler.UseProxy = True
'Dim client As New HttpClient(handler)
Dim client As New HttpClient()
'Construct the Uri
Dim uri As String = "https://egrcb.archer.rsa.com/api/core/security/login"
Dim vUri As New Uri(uri)
client.BaseAddress = vUri
'Build the request
'-Headers:
client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "application/json,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
'-Body:
Dim body As String = "{""InstanceName"":""" + instancename + """,""Username"":""" + username + """,""UserDomain"":"""",""Password"":""" + password + """}"
Dim content As StringContent = New System.Net.Http.StringContent(body, Encoding.UTF8, "application/json")
'***CALL THE API***
Dim response As HttpResponseMessage = client.PostAsync(uri, content).Result
'******************
'Some additional logic to process what came back to reuse it for other things - this is
'fairly crude and simplistic, but you can write classes or add libraries to consume the
'JSON that is passed back from the API and handle things in a more sophisticated way if you need to
Dim status As String = response.StatusCode.ToString()
Dim result As String = response.Content.ReadAsStringAsync().Result
Dim statusCode As System.Net.HttpStatusCode = response.StatusCode
Dim codeNumber As Integer = CInt(statusCode)
'Some simple error catching - in real-world code you would need to build some logic out for these
If codeNumber <> 200 Then
Throw New Exception("The request failed for some reason")
End If
If result.Contains("RequestedObject"":null") Then
Throw New Exception("The login failed for some reason")
End If
Dim extractedSessionId As String = result.Substring(result.IndexOf("SessionToken"":") + 15, 32)
Return extractedSessionId
End Function
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim request As HttpWebRequest
Dim response As HttpWebResponse = Nothing
Dim reader As StreamReader
Dim rawresp As String = ""
'Login
Dim sessionid As String = login(txtUserID.Text, txtEnvironmnent.Text, txtPassword.Text)
txtSessionID.Text = sessionid
'SOAPlogin()
lblStatus.Text = "Logged In..."
Try
DGVFields.Rows.Clear()
DGVFields.Columns.Clear()
lblStatus.Text = "Initiating Connection..."
request = WebRequest.Create("https://egrcb.archer.rsa.com/api/core/content/2125562")
request.ContentType = "application/json"
request.Headers.Add("Authorization", "Archer session-id=""" & txtSessionID.Text & """")
request.Headers.Add("X-Http-Method-Override", "GET")
request.Timeout = 6000
'request.Credentials = CredentialCache.DefaultCredentials
'Dim proxy As New WebProxy
'Dim newUri As New Uri("http://proxy-test.com:8080")
'proxy.Address = newUri
'proxy.Credentials = CredentialCache.DefaultCredentials
'request.Proxy = proxy
lblStatus.Text = "Getting Response..."
'get repsonse
response = request.GetResponse()
'Display
Console.WriteLine(CType(response, HttpWebResponse).StatusDescription)
'Get the stream content returned
Dim datastream As Stream = response.GetResponseStream()
'Open reader
reader = New StreamReader(datastream)
lblStatus.Text = "Reading response..."
Application.DoEvents()
rawresp = reader.ReadToEnd()
lblStatus.Text = "Parsing results..."
Application.DoEvents()
Catch ex As Exception
End Try
End sub
公共共享函数登录(用户名为字符串,instancename为字符串,密码为字符串)
'作为新的HttpClientHandler()的Dim处理程序
'handler.Proxy=New System.Net.WebProxy(“Proxy test.com:8080”)
'handler.Proxy.Credentials=CredentialCache.DefaultCredentials
'handler.UseProxy=True
'作为新HttpClient(处理程序)的Dim客户端
作为新的HttpClient()的Dim客户端
'构造Uri
Dim uri作为字符串=”https://egrcb.archer.rsa.com/api/core/security/login"
Dim vUri作为新Uri(Uri)
client.BaseAddress=vUri
'生成请求
“-标题:
client.DefaultRequestHeaders.TryAddWithoutValidation(“Accept”、“application/json、text/html、application/xhtml+xml、application/xml;q=0.9、*/*;q=0.8”)
“-机构:
Dim正文为字符串=“{”“InstanceName”“:”“+InstanceName+”,“Username”“:”“+Username+”,“UserDomain”“:”“,“Password”“:”“+Password+”}”
Dim content As StringContent=New System.Net.Http.StringContent(body,Encoding.UTF8,“application/json”)
'***调用API***
Dim响应为HttpResponseMessage=client.PostAsync(uri,content.Result)
'******************
“一些额外的逻辑来处理返回的内容,以便将其用于其他用途——这是
“相当粗糙和简单,但您可以编写类或添加库来使用
'从API传回的JSON,并在需要时以更复杂的方式处理
Dim status As String=response.StatusCode.ToString()
Dim结果为字符串=response.Content.ReadAsStringAsync().result
Dim状态代码为System.Net.HttpStatusCode=response.statusCode
整数形式的Dim代码编号=CInt(状态代码)
“一些简单的错误捕捉——在现实世界的代码中,您需要为这些代码构建一些逻辑
如果代码是200那么
抛出新异常(“请求因某种原因失败”)
如果结束
如果result.Contains(“RequestedObject”“:null”),则
抛出新异常(“由于某种原因登录失败”)
如果结束
Dim extractedSessionId为String=result.Substring(result.IndexOf(“SessionToken”“:”)+15,32)
返回提取的会话ID
端函数
私有子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
Dim请求作为HttpWebRequest
作为HttpWebResponse的Dim响应=无
作为StreamReader的Dim reader
Dim RAWREP As String=“”
'登录
Dim sessionid As String=login(txtserid.Text、txtEnvironmnent.Text、txtPassword.Text)
txtSessionID.Text=sessionid
'SOAPlogin()
lblStatus.Text=“已登录…”
尝试
DGVFields.Rows.Clear()
DGVFields.Columns.Clear()
lblStatus.Text=“正在启动连接…”
request=WebRequest.Create(“https://egrcb.archer.rsa.com/api/core/content/2125562")
request.ContentType=“应用程序/json”
request.Headers.Add(“授权”、“Archer会话id=”“”&txtSessionID.Text&“”)
request.Headers.Add(“X-Http-Method-Override”、“GET”)
请求。超时=6000
'request.Credentials=CredentialCache.DefaultCredentials
'将代理设置为新的WebProxy
'将新Uri作为新Uri('http://proxy-test.com:8080")
'proxy.Address=newUri
'proxy.Credentials=CredentialCache.DefaultCredentials
'request.Proxy=Proxy
lblStatus.Text=“获取响应…”
“叫雷松斯
response=request.GetResponse()
"展示,
Console.WriteLine(CType(响应,HttpWebResponse).StatusDescription)
'获取返回的流内容
Dim datastream As Stream=response.GetResponseStream()
“开放读者
reader=新的StreamReader(数据流)
lblStatus.Text=“读取响应…”
Application.DoEvents()
rawrep=reader.ReadToEnd()
lblStatus.Text=“解析结果…”
Application.DoEvents()
特例
结束尝试
端接头
这里只是一个暗中操作,但我假设您的工作有webfilter/代理设置?可能是从web请求中剥离特定的头,或者某些防火墙甚至具有删除未知头函数,如果头“X-Http-Method-Override”不在其列表中,则请求将永远不会响应。我无法解释为什么它会挂起超过6秒,这是在超时中设置的。。您是否尝试过在工作中调试并一步一步地完成
问候
利亚姆