Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net HttpWebRequest401响应_Vb.net_Httpwebrequest_Http Status Code 401 - Fatal编程技术网

Vb.net HttpWebRequest401响应

Vb.net HttpWebRequest401响应,vb.net,httpwebrequest,http-status-code-401,Vb.net,Httpwebrequest,Http Status Code 401,我有一个用VB.net编写的程序,可以与IIS上托管的数据服务进行交互。身份验证通过用户的Active Directory凭据进行处理。在我的一个客户站点上,大约100个客户工作站中就有一个工作站的数据服务请求失败,状态为401 一些其他相关信息:生产IIS安装分为两个节点。负载平衡器将流量定向到节点。此外,从相关工作站使用Internet Explorer发出的完全相同的请求不会失败 当我通过VB代码发出请求时,我怀疑有什么东西正在从请求中剥离用户的凭据,但我很难理解这可能是什么 下面是我用来

我有一个用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
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
将其与工作机器请求的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
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的机器是负载平衡器


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

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

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

我遇到了完全相同的问题,它解决了。

必须将keepalive设置为true。设置keepalive=true修复了我的问题。下页说明keepalive在身份验证握手中的作用:


我仍然不知道为什么这个请求不起作用,因为这个答案本身是无用的。为什么DefaultCredentials会解决这个问题?谢谢你的建议。这个解决方案在我的情况下不起作用。FWIW我不认为请求是通过代理路由的:在“控制面板”>“Internet选项”>“连接”>“LAN设置”中的工作站上未设置代理。我发现如果显式创建凭据-Dim凭据作为NetworkCredential=New NetworkCredentialuser,通过-然后将凭据分配给httpWebRequest。凭据属性请求成功。我仍然不明白为什么这只发生在一台机器上。