Vb.net 当状态不是200时,如何读取web请求的响应?
当我遇到web异常时,我很难从vb.net中的HTTP web请求中获取响应文本 这就是我正在使用的代码Vb.net 当状态不是200时,如何读取web请求的响应?,vb.net,webexception,Vb.net,Webexception,当我遇到web异常时,我很难从vb.net中的HTTP web请求中获取响应文本 这就是我正在使用的代码 Try myWebResponse = CType(request.GetResponse(), HttpWebResponse) myStreamReader = New StreamReader(myWebResponse.GetResponseStream()) ResponseText = myStreamRe
Try
myWebResponse = CType(request.GetResponse(), HttpWebResponse)
myStreamReader = New StreamReader(myWebResponse.GetResponseStream())
ResponseText = myStreamReader.ReadToEnd
If myWebResponse.StatusCode = HttpStatusCode.Accepted Or myWebResponse.StatusCode = 200 Then
SendResult = True 'Sent
SendStatus = 1 'message sent successfully
Try
Integer.TryParse(myWebResponse.Headers("Number-Of-MT-PDU"), num_MT_PDU)
Catch ex As Exception
End Try
Else
SendStatus = 2 'message processed but not sent successfully
End If
Catch e As WebException
If (e.Status = WebExceptionStatus.ProtocolError) Then
Dim response As WebResponse = e.Response
Using (response)
Dim httpResponse As HttpWebResponse = CType(response, HttpWebResponse)
statusCode = httpResponse.StatusCode
Try
myStreamReader = New StreamReader(response.GetResponseStream())
Using (myStreamReader)
ResponseText = myStreamReader.ReadToEnd & "Status Description = " & HttpWebResponse.StatusDescription
End Using
Catch ex As Exception
Logger.LogError(Me, ex)
End Try
End Using
令人烦恼的是,我正在联系的API使用404作为有效响应。如果我将请求放在浏览器中,将显示一些消息文本。我希望能够在我的程序中使用该文本。我不能简单地使用错误代码来确定操作,因为我认为我无法区分有效的404响应和实际错误
在这一行的代码中
myWebResponse = CType(request.GetResponse(), HttpWebResponse)
抛出异常
在例外情况下,我可以得到404代码和描述,但不能得到响应流。它总是空的
如果我得到一个200的响应,我会在响应流中得到文本,没有问题
在web异常响应对象(在Visual Studio调试器中)中,我已检查了标题和对象值,但在任何地方都找不到响应文本。如果我将请求URL粘贴到浏览器中,我会返回响应文本,即使它是404
fiddler中的原始响应:
HTTP/1.1 404未找到连接:关闭内容类型:text/plain;字符集=UTF-8内容长度:35“响应消息”
关于如何在我的程序中获得“响应消息”有什么想法吗?我必须在服务器上使用.Net
感谢任何人提供的帮助。此LINQPad查询工作正常,转储由我的web服务器的“未找到”错误网页提供的HTML:
Dim rq = System.Net.WebRequest.Create(New Uri("http://localhost/test"))
Try
Dim rs = rq.GetResponse
rs.Dump
Catch Ex As System.Net.WebException
Dim rs = Ex.Response
Call (New StreamReader(rs.GetResponseStream)).ReadToEnd.Dump
End Try
仅供参考,您的代码对我有效,除了假定的打字错误reHttpWebResponse.StatusDescription
(并注释掉“不相关的东西”),同样作为LINQPad查询(在.NET 4.0中):
我还确认了上述代码(添加了推断的
As
子句,并将.Dump
调用转换为控制台.WriteLine
)在.NET 2.0中使用VB8工作。请注意,关键是即使GetResponseStream()的行为引发.NET WebException,HttpWebResponse实际上传递给WebException对象,因此在Catch中,您可以对WebException.Response对象执行一个新的GetResponseStream()
下面是与初始GetResponseStream()捕获时非常相似的代码
试试看
OriginalResponseStream=GetResponseStream(OriginalHTTPWebResponse)
将wex捕获为WebException
作为WebResponse=wex.response的Dim响应
Dim状态代码为HttpStatusCode
Dim ResponseText作为字符串
将httpResponse设置为HttpWebResponse=CType(响应,HttpWebResponse)
statusCode=httpResponse.statusCode
尝试
将myStreamReader设置为新的StreamReader(response.GetResponseStream())
使用(myStreamReader)
ResponseText=myStreamReader.ReadToEnd
Process(ResponseText)“一件可能提供线索的事情是,使用它来查看实际通过线路返回的内容。我想我以前也遇到过同样的问题。无法使用webclient。等等,让我查一下。我问了类似的问题。这里也没有答案。我只是使用WebClient.DownloadData
和基本WebException(我使用的是DotLisp,所以在“顶部”有一个BackTraceeException和一个TargetInvocationException),Response
存在,并且与新StreamReader(Response.GetResponseStream()等效).ReadToEnd
工作正常。您好,非常感谢您的回复。我问这个问题已经有一段时间了,我无法访问发生问题的原始代码或服务器,但我会接受你的回答,因为它看起来很好。唯一的问题是,我被困在运行.NET2.0的服务器上(该公司显然害怕更改),我有一些内存,可以获取标准的404服务器响应文本,但不能获取我调用的API返回的文本。无论如何,希望这一切都能帮助某人,某处。谢谢,这个答案非常有用
Dim request = WebRequest.Create("http://localhost/test")
Dim myStreamReader As StreamReader
Dim SendStatus As Integer = -1
Dim statusCode As HttpStatusCode
Dim ResponseText As String
Try
Dim myWebResponse = CType(request.GetResponse(), HttpWebResponse)
myStreamReader = New StreamReader(myWebResponse.GetResponseStream())
ResponseText = myStreamReader.ReadToEnd
If myWebResponse.StatusCode = HttpStatusCode.Accepted Or myWebResponse.StatusCode = 200 Then
'SendResult = True 'Sent
SendStatus = 1 'message sent successfully
'Try
' Integer.TryParse(myWebResponse.Headers("Number-Of-MT-PDU"), num_MT_PDU)
'Catch ex As Exception
'End Try
Else
SendStatus = 2 'message processed but not sent successfully
End If
Catch e As WebException
If (e.Status = WebExceptionStatus.ProtocolError) Then
Dim response As WebResponse = e.Response
Using (response)
Dim httpResponse As HttpWebResponse = CType(response, HttpWebResponse)
statusCode = httpResponse.StatusCode
Try
myStreamReader = New StreamReader(response.GetResponseStream())
Using (myStreamReader)
ResponseText = myStreamReader.ReadToEnd & "Status Description = " & httpResponse.StatusDescription ' HttpWebResponse.StatusDescription
End Using
Catch ex As Exception
'Logger.LogError(Me, ex)
ex.Dump("Exception")
End Try
End Using
End If
End Try
ResponseText.Dump("ResponseText")
Try
OriginalResponseStream = GetResponseStream(OriginalHTTPWebResponse)
Catch wex as WebException
Dim response As WebResponse = wex.Response
Dim statusCode As HttpStatusCode
Dim ResponseText As String
Dim httpResponse As HttpWebResponse = CType(response, HttpWebResponse)
statusCode = httpResponse.StatusCode
Try
Dim myStreamReader As New StreamReader(response.GetResponseStream())
Using (myStreamReader)
ResponseText = myStreamReader.ReadToEnd
Process(ResponseText) '<===as in whatever you need to do with the response
End Using
Catch ex As Exception
HandleIt(ex.Message) '<===as in whatever you want to do if Exception during the above
End Try
End Try