【问题标题】:Issue with sending web requests发送 Web 请求的问题
【发布时间】:2019-08-02 18:32:23
【问题描述】:

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

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

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

有人有什么建议吗?

【问题讨论】:

  • 您得到的 500 错误究竟是什么?您的问题中需要包含这些细节。
  • InternalServerError
  • 这是返回给客户端的错误,这意味着服务器出现问题。您需要转到服务器,并找出错误的含义。这通常会记录到 Windows 事件日志中。您应该能够启动事件查看器并查看应用程序文件夹并查看一些相关错误。或者以其他方式检查这些应用程序具有的任何日志框架(或使用 SerilogNLog 等工具安装适当的日志框架)。
  • 我为我的问题添加了更多内容。我正在使用 NLog,这些站点会抛出 InternalServerError,但大多数站点都很好。我自己导航到这些网站,一切都很好。
  • 这仍然没有改变您需要准确找出内部服务器错误是什么的事实。否则,您会在黑暗中猜测他们为什么给您 500 分。那是在浪费您的时间。你说你有 NLog:然后检查日志,看看错误是什么。如果那里没有错误,则向您的应用程序添加额外的日志记录。

标签: c# http networking


【解决方案1】:

我能够通过删除 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;
    }       

【讨论】:

  • 我再次运行了准确的代码,得到的错误信息和以前一样。
【解决方案2】:

如果用户无权访问该网站,我会通过在应用中放置自定义错误页面来修复错误。

提出这个问题 A -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();

【讨论】:

    【解决方案3】:

    创建具有最小权限的 Windows 域帐户,然后以该用户(首选)身份运行 Web 服务,或者将该帐户的凭据嵌入到其配置文件中并在部署过程中进行设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多