我正在尝试访问REST Web服务,但是我的代码不起作用并且不断抛出HTTP 401错误
从初始ssl请求的Wireshark中查看此示例屏幕截图:
这是从对同一网址的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似乎也没有改变这个问题。
答案 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)