发送网络请求的问题

时间:2019-08-02 18:32:23

标签: c# http networking

我已经开发了Windows服务,该服务除其他外将使用HttpClient查询我们Web服务器上的各种网站。由于该服务是在NETWORK SERVICE帐户下运行的,因此即使它们启动了,某些站点也会返回500错误。我尝试在Web应用程序中执行此操作,但是它要求Web应用程序始终处于启动状态,并且应用程序池帐户也引发相同的错误。

我发现的唯一解决方法是使用我的用户名,密码和域插入NetworkCredential。显然,出于安全考虑,这不是一个真正的解决方案,每次更改密码时我都必须更新该应用程序。但是至少所有应用程序都应该返回200个。

我们有一个数据库,用于处理基于Windows登录的网站访问。该数据库仅接受有效的雇员。 NETWORK SERVICE不是员工。也许我需要允许在虚拟目录级别的这些站点上进行匿名访问。访问这些网站时,NETWORK SERVICE将使用匿名特权。

有人有什么建议吗?

3 个答案:

答案 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服务,或者将该帐户的凭据嵌入其配置文件中,并在部署过程中对其进行设置。