【问题标题】:Accessing REST WebService in VB.NET在 VB.NET 中访问 REST WebService
【发布时间】:2010-08-09 23:13:14
【问题描述】:

我正在尝试访问 REST Web 服务,但是我的代码无法正常工作并不断抛出 HTTP 401 错误

请参阅来自 Wireshark 的初始 ssl 请求的示例屏幕截图:

这是来自对具有相同详细信息的相同网址的 Curl 调用。问题是在我的 VB.NET 版本下,缺少 SSL 数据包的“扩展:server_name”(和相关)部分,我相信这会导致服务器在接下来的几个数据包中没有回复服务器密钥交换。

下面是VB.NET代码

    Dim webRequest As HttpWebRequest = DirectCast(System.Net.WebRequest.Create(UrlString), HttpWebRequest)
    webRequest.Method = "GET"
    webRequest.ContentType = "application/x-www-form-urlencoded"

    webRequest.Credentials = New NetworkCredential(username, password)

    Dim response As HttpWebResponse = DirectCast(webRequest.GetResponse(), HttpWebResponse)

这在最后一行失败(HTTP 401 错误),问题似乎与我的代理无关,并且服务器的用户凭据是正确的,因为此请求来自 Curl 和 wget。

我已经尝试设置 AuthenticationLevel 以及手动设置 Authorization 标头,PreAuthenticate 似乎也没有改变这个问题。

【问题讨论】:

    标签: .net rest ssl https httpwebrequest


    【解决方案1】:

    答案是 WebService 没有回复有效的 HTTP401 WWW-Authenticate 标头,而只是返回如下代码:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Error>
        <ErrorCode>NO_SUITABLE_AUTHENTICATION_METHOD</ErrorCode>
        <ErrorDescription>No suitable active authentication mechanism found to authorise request - authorise using supported mechanisms</ErrorDescription>
        <RequestID>gcqsrtvn</RequestID>
        <SystemTime>2010-08-12T09:14:21.831+10:00</SystemTime>
    </Error>
    

    所以我必须手动添加身份验证标头,如下所示: http://devproj20.blogspot.com/2008/02/assigning-basic-authorization-http.html

    代码:

    Dim authBytes() As Byte = System.Text.Encoding.UTF8.GetBytes(String.Format("{0}:{1}", username, password).ToCharArray())
    webRequest.Headers("Authorization") = "Basic " + Convert.ToBase64String(authBytes)
    

    【讨论】:

    • 这似乎没有意义。在您的问题中,您写道您收到了 401 回复,并且您尝试自己添加授权标头,但没有成功。那么,为什么它现在可以工作?此外,如果您只想在第一个请求本身中发送授权标头,您可以设置 PreAuthenticate=true,并在 CredentialCache 上设置凭据,使用“Basic”作为身份验证方法。 **** 无论如何,就像我说的,如果你能根据我给出的指示找到踪迹,我可以告诉你发生了什么事。服务器期望 Authorization 标头但不挑战客户端是不合法的。
    • 返回的 401 不符合标准,并且不包含任何身份验证标头信息。至于为什么它以前不起作用,那是由于编码问题和我用于手动标题的代码。在这种情况下,设置 PreAuthenticate 也不起作用,我连接的服务非常草率并且喜欢以非常特定的方式完成的事情......但没有关于如何做的文档。合法与否无关紧要,它不这样做,这是我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多