好的,我们有一个应用程序,其中包含一个托管多个ASMX Web服务的网站,以及一个运行在WinMo 6.1上的手持应用程序,它调用Web服务。
在办公室里发展,一切都很完美。
现在我们已经在客户端安装了它,我们安装了所有服务器并安装了手持设备。但是,手持设备现在无法再连接到网络服务。
我在我的错误处理程序中添加了额外的代码,专门捕获WebException异常,并在日志记录中以不同方式处理它们以输出额外信息(.Status和.Response)。
我正在退出状态,即返回[7]
或ProtocolError
。但是,当我尝试读取ResponseStream(使用WebException.Response.GetResponseStream
)时,它返回一个CanRead
设置为False
的流,因此我无法获得有关什么的更多详细信息。出错了。
所以我猜我有两件事要求帮助...
a)试图从WebException
中获取更多信息的任何帮助?
b)可能导致ProtocolError
例外的原因是什么?
由于客户端在现场具有完整的登录启用代理设置,因此事情变得更加复杂。这最初阻止了对网站的所有访问,即使是从浏览器也是如此。因此,我们在WinMo设备上的HTTP网络连接中输入了登录详细信息。现在它可以很好地进入网站。
事实上,我甚至可以提起网络服务,并从浏览器中调用方法 (PocketIE)。所以我知道设备能够通过HTTP看到web服务。但是当尝试从.NET应用程序调用它们时,它会抛出ProtocolError [7]
。
以下是我的代码,它记录了异常并且无法从Response
读出WebException
。
Public Sub LogEx(ByVal ex As Exception)
Try
Dim fn As String = Path.Combine(ini.CorePath, "error.log")
Dim t = File.AppendText(fn)
t.AutoFlush = True
t.WriteLine(<s>===== <%= Format(GetDateTime(), "MM/dd/yyyy HH:mm:ss") %> =====<%= vbCrLf %><%= ex.Message %></s>.Value)
t.WriteLine()
t.WriteLine(ex.ToString)
t.WriteLine()
If TypeOf ex Is WebException Then
With CType(ex, WebException)
t.WriteLine("STATUS: " & .Status.ToString & " (" & Val(.Status) & ")")
t.WriteLine("RESPONSE:" & vbCrLf & StreamToString(.Response.GetResponseStream()))
End With
End If
t.WriteLine("=".Repeat(50))
t.WriteLine()
t.Close()
Catch ix As Exception : Alert(ix) : End Try
End Sub
Private Function StreamToString(ByVal s As IO.Stream) As String
If s Is Nothing Then Return "No response found."
// THIS IS THE CASE BEING EXECUTED
If Not s.CanRead Then Return "Unreadable response found."
Dim rv As String = String.Empty, bytes As Long, buffer(4096) As Byte
Using mem As New MemoryStream()
Do While True
bytes = s.Read(buffer, 0, buffer.Length)
mem.Write(buffer, 0, bytes)
If bytes = 0 Then Exit Do
Loop
mem.Position = 0
ReDim buffer(mem.Length)
mem.Read(buffer, 0, mem.Length)
mem.Seek(0, SeekOrigin.Begin)
rv = New StreamReader(mem).ReadToEnd()
mem.Close()
End Using
Return rv.NullOf("Empty response found.")
End Function
提前致谢!
答案 0 :(得分:1)
我无法从WebException类中获取更多信息。出于某种原因,GetResponseStream始终返回不可读的流。
我能够将问题缩小到代理身份验证,但是通过编写一个单独的小程序,它只是尝试请求网页并读取响应并将其放入文本框中。
此程序返回proxy authentication required
的回复。我觉得这很奇怪,因为我把代理信息放到我设备上的网络连接设置中。我希望这适用于在该连接上发出的所有网络流量;显然它只适用于通过浏览器的流量,而不是应用程序请求。奇。