【问题标题】:WinMo > ASMX WebException - how to get details?WinMo > ASMX WebException - 如何获取详细信息?
【发布时间】:2011-03-02 09:14:49
【问题描述】:

好的,我们有一个应用程序,它包含一个托管多个 ASMX Web 服务的网站,以及一个在 WinMo 6.1 上运行并调用 Web 服务的手持应用程序。

一直在办公室开发,一切都很完美。

现在我们已经在客户端安装它,我们已经设置了所有服务器并安装了手持设备。然而,手持设备现在不再能够连接到网络服务。

我在错误处理程序中添加了额外代码,专门捕获 WebException 异常并在日志记录中以不同方式处理它们以输出额外信息(.Status 和 .Response)。

我正在获取返回[7]ProtocolError 的状态。但是,当我尝试读出 ResponseStream(使用WebException.Response.GetResponseStream)时,它返回了一个CanRead 设置为False 的流,因此我无法获得有关问题的更多详细信息。

所以我想我要寻求帮助的有两件事......

a) 对尝试从WebException 获取更多信息有任何帮助吗?

b) 什么可能导致ProtocolError 异常?

由于客户端在现场有一个完整的支持登录的代理设置,事情变得更加复杂。这最初阻止了对网站的所有访问,即使是从浏览器中也是如此。因此,我们在 WinMo 设备上的 HTTP 网络连接中输入了登录详细信息。现在它可以正常访问网站了。

事实上,我什至可以很好地启动 web 服务并调用 从浏览器 (PocketIE) 的方法。所以我知道设备能够通过 HTTP 看到 web 服务。但是当尝试从 .NET 应用程序调用它们时,它会抛出 ProtocolError [7]

这是我的代码,它记录了异常并且未能从WebException 中读出Response

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

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    我无法从 WebException 类中获得更多信息。由于某种原因,GetResponseStream 总是返回一个不可读的流。

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

    该程序返回了proxy authentication required 的响应。我觉得这很奇怪,因为我将代理信息放入设备的网络连接设置中。我会认为这将适用于该连接上的所有网络流量;显然它只适用于通过浏览器的流量,而不是应用程序请求。奇怪的。

    【讨论】:

    • 嗨,我遇到了这个确切的问题。为了解决问题,您必须在应用程序中做什么?谢谢!
    • 如果我没记错的话,我们所做的是让客户的网络人员参与进来,将终端设置为获取特定范围内的 IP,然后网络人员进行操作,以便手持设备和服务器之间的请求被允许绕过代理。但是您也可以尝试使用与此类似的代码手动设置请求的代理信息:pastebin.com/TEcYk4Rv。 HTH!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多