在VB.NET中访问REST WebService

时间:2010-08-09 23:13:15

标签: .net rest ssl https httpwebrequest

我正在尝试访问REST Web服务,但是我的代码不起作用并且不断抛出HTTP 401错误

从初始ssl请求的Wireshark中查看此示例屏幕截图:

WireShark Screenshot

这是从对同一网址的Curl调用开始,具有相同的细节。问题是在我的VB.NET版本下,SSL数据包的“Extension:server_name”(及相关)部分丢失了,我相信这会导致服务器在接下来的几个数据包中不回复Server密钥交换。

以下是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似乎也没有改变这个问题。

1 个答案:

答案 0 :(得分: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)