【发布时间】:2014-10-16 17:27:30
【问题描述】:
我有一个用 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 的机器是负载均衡器。
我在两台机器上登录的域和用户完全相同。
【问题讨论】:
-
我发现如果显式创建凭据 - Dim credentials As NetworkCredential = New NetworkCredential(user, pass) - 然后将凭据分配给 httpWebRequest.Credentials 属性,请求成功。我仍然对为什么这只发生在一台机器上感到困惑。
标签: vb.net httpwebrequest http-status-code-401