WinMo&​​gt; ASMX WebException - 如何获取详细信息?

时间:2010-06-10 20:25:01

标签: web-services .net-3.5 compact-framework proxy asmx

好的,我们有一个应用程序,其中包含一个托管多个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

提前致谢!

1 个答案:

答案 0 :(得分:1)

我无法从WebException类中获取更多信息。出于某种原因,GetResponseStream始终返回不可读的流。

我能够将问题缩小到代理身份验证,但是通过编写一个单独的小程序,它只是尝试请求网页并读取响应并将其放入文本框中。

此程序返回proxy authentication required的回复。我觉得这很奇怪,因为我把代理信息放到我设备上的网络连接设置中。我希望这适用于在该连接上发出的所有网络流量;显然它只适用于通过浏览器的流量,而不是应用程序请求。奇。