由于业务实现上的需要,在自定义的Windows服务中发起对IIS站点下某aspx页面的访问请求,代码很简单,只有几句:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(WebSiteUrl); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream stream = response.GetResponseStream();
在控制台程序中已测试成功,然而在windows服务程序中运行时,一直捕获到IIS返回"401 未经授权”的错误。下面是环境配置情况:
1、IIS站点。使用的是windows身份认证,允许所有用户访问,但禁用了匿名访问;
2、Windows服务使用域管理员身份运行;
尝试了很久无果。后来想,是否windows服务中发起http请求时不会自动发送当前的windows凭据而导致无法访问?好比是,方法中的参数允许任意整型值,但不允许根本没有值,于是乎,找了一些资料用于获取当前凭据,在下面的帖子中找到了答案:
HOW TO 将当前凭据传递到 ASP.NET Web 服务
关键的代码只有一行:
myProxy.Credentials = System.Net.CredentialCache.DefaultCredentials
至此,问题解决。