httpwebrequest 401回复

时间:2014-10-16 17:27:31

标签: vb.net httpwebrequest http-status-code-401

我有一个用VB.net编写的程序,它与IIS上托管的数据服务进行交互。身份验证通过用户Active Directory凭据进行处理。在我的一个客户站点上,在客户工作站中的一个(大约100个)中,对数据服务的请求失败,状态为401.

一些其他相关信息:生产IIS安装分为两个节点。负载均衡器将流量定向到节点。此外,使用Internet Explorer从相关工作站发出的完全相同的请求也不会失败。

我怀疑当我通过VB代码发出请求时,某些内容正在从请求中删除用户的凭据,但我对这可能是什么感到难过。

以下是我用来发出请求的VB代码:

  Dim httpRequest As HttpWebRequest = Nothing
  Dim httpResponse As HttpWebResponse = Nothing

  httpRequest = WebRequest.Create("http://server/xyzportal/portal.php")
  httpRequest.KeepAlive = False
  httpRequest.UseDefaultCredentials = True
  httpRequest.Method = "GET"
  httpRequest.ContentLength = 0
  httpRequest.Accept = "text/xml"
  httpRequest.Timeout = 3000000

  httpResponse = httpRequest.GetResponse

任何想法都会受到赞赏。

其他信息:以下是失败请求的IIS日志条目。请注意,第二个条目不包括Windows用户名:

2014-11-11 22:20:42 199.99.51.58 GET /xyzportal/portal.php - 80 - 199.99.50.128 - 401 2 5 0
2014-11-11 22:20:42 199.99.51.58 GET /xyzportal/portal.php - 80 - 199.99.50.128 - 401 1 2148074248 0

将该条目与来自工作机器的请求的IIS条目进行对比。请注意,第二个条目包含Windows用户名:

2014-11-11 22:56:40 199.99.51.58 GET /xyzportal/portal.php - 80 - 199.99.50.128 - 401 2 5 0 
2014-11-11 22:56:40 199.99.51.58 GET /xyzportal/portal.php - 80 MYDOMAIN\jreichert 199.99.50.128 - 200 0 0 93

IP地址为199.99.50.128的计算机是负载平衡器。

我在两台计算机上都使用完全相同的域和用户登录。

2 个答案:

答案 0 :(得分:0)

您还没有说,但如果您使用代理,那么您还没有告诉HttpRequest使用代理的AD用户凭据,因此您收到 401 Unauthorized 错误,即您被拒绝通过代理访问。如果是这样,请尝试明确告诉它......

HttpRequest.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials

我遇到了完全相同的问题而且它已经解决了。

答案 1 :(得分:0)

keepalive必须设置为true。设置keepalive = true可以解决我的问题。以下页面解释了keepalive在身份验证握手中的作用:

http://www.innovation.ch/personal/ronald/ntlm.html

当keepalive = false时,我仍然不确定为什么请求在我的客户群中的< 1%工作站上不起作用。我所知道的是设置keepalive = true会使请求在100%的工作站上运行。

更多信息:当身份验证协议为Kerebos时,keepalive必须设置为true。如果身份验证协议是NTLM,则该请求有效。我不知道为什么Kerebos仅在请求不起作用的两个工作站上使用。