我已经开发了Windows服务,该服务除其他外将使用HttpClient查询我们Web服务器上的各种网站。由于该服务是在NETWORK SERVICE帐户下运行的,因此即使它们启动了,某些站点也会返回500错误。我尝试在Web应用程序中执行此操作,但是它要求Web应用程序始终处于启动状态,并且应用程序池帐户也引发相同的错误。
我发现的唯一解决方法是使用我的用户名,密码和域插入NetworkCredential。显然,出于安全考虑,这不是一个真正的解决方案,每次更改密码时我都必须更新该应用程序。但是至少所有应用程序都应该返回200个。
我们有一个数据库,用于处理基于Windows登录的网站访问。该数据库仅接受有效的雇员。 NETWORK SERVICE不是员工。也许我需要允许在虚拟目录级别的这些站点上进行匿名访问。访问这些网站时,NETWORK SERVICE将使用匿名特权。
有人有什么建议吗?
答案 0 :(得分:0)
我能够通过删除HttpResponseMessage对象周围的using语句来解决此问题。下面是正在运行的代码。
public override async Task<bool> QueryWebSites()
{
HttpClientHandler clientHandler = new HttpClientHandler();
clientHandler.UseDefaultCredentials = true;
clientHandler.PreAuthenticate = true;
using (HttpClient client = new HttpClient(clientHandler)) {
foreach (CRITICAL_APPS app in this.apps) {
HttpResponseMessage response = await client.GetAsync(app.URL);
bool success = response.StatusCode == HttpStatusCode.OK;
if (!success) {
LOGGER.Debug(app.URL + " failed" + response.StatusCode);
LOGGER.Debug(response.ReasonPhrase);
LOGGER.Debug(response.RequestMessage);
appStatus.Add(new CRITICAL_APPS_STATUS {APP_ID = app.ID, INITIAL_DETECTION =DateTime.Now, ID = 77 });
} else {
LOGGER.Debug(app.URL + " succeeded");
}
}
}
clientHandler.Dispose();
return true;
}
答案 1 :(得分:0)
如果用户无权访问该网站,我通过在应用程序中放置一个自定义错误页面来修复该错误。
给出此问题的人-1应该予以取消。这可能会帮助有类似问题的其他人。
下面的代码使我可以跟踪问题。
using (HttpClient client = new HttpClient(clientHandler)) {
foreach (CRITICAL_APPS app in this.apps) {
using (HttpResponseMessage response = await client.GetAsync(app.URL))
{
bool success = response.StatusCode == HttpStatusCode.OK;
if (success) {
LOGGER.Debug(app.URL + " succeeded");
} else {
if (response.StatusCode == HttpStatusCode.InternalServerError)
{
// Try to read response, log error etc.
var errorxml = await response.Content.ReadAsStringAsync();
LOGGER.Debug(app.URL + " failed" + errorxml);
}
appStatus.Add(new CRITICAL_APPS_STATUS { APP_ID = app.ID, INITIAL_DETECTION = DateTime.Now, ID = 77 });
}
}
}
}
clientHandler.Dispose();
答案 2 :(得分:-1)
创建具有最小权限的Windows域帐户,然后以该用户(首选)身份运行Web服务,或者将该帐户的凭据嵌入其配置文件中,并在部署过程中对其进行设置。