【问题标题】:HttpWebRequest.GetResponse() returning 404 ErrorHttpWebRequest.GetResponse() 返回 404 错误
【发布时间】:2015-02-08 17:26:47
【问题描述】:

我有一些代码调用 HttpWebRequest 的 GetResponse() 方法从 URL 检索 HTML 并将其返回给调用方法。

这在我的开发和 QA 环境中运行良好,但现在我已将其上传到我的 UAT 服务器,我不断收到以下错误:

远程服务器返回错误:(404) Not Found。

Dev/QA 和 UAT 的主要区别在于 UAT 使用基于 SSL/HTTPS 的 URL,而 Dev/QA 使用 HTTP。我引入了以下代码行来帮助我进一步进步:

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);

AcceptAllCertifications 总是返回 true,但我仍然收到 404 错误。

我之前遇到此错误的人能够通过仅确保用于 HttpWebRequest 的 URI 在末尾没有斜杠来解决问题(请参阅:Simple HttpWebRequest over SSL (https) gives 404 Not Found under C#)但这并没有什么区别对我来说。

我现在已经尝试了这篇文章中的建议(参见:HttpWebResponse returns 404 error),我在页面上呈现异常。这绕过了黄色警告屏幕,并为我提供了更多信息,包括它试图从中获得响应的 URL。但是,当我将 URL 复制并粘贴到浏览器中时,它可以正常工作并在页面上呈现 HTML。因此,我很高兴在 GetResponse 调用中使用了正确的 URL。

有没有人知道是什么让我如此悲伤?如前所述,这似乎只是我使用 SSL 的 UAT 服务器上的问题。

这是我的帮助代码:

public static string GetHtmlValues()
    {

        var webConfigParentUrlValue = new Uri(ConfigurationManager.AppSettings["ParentUrl"]);

        var destinationUrl = HttpContext.Current.Request.Url.AbsoluteUri;

        var path = "DestinationController" + "/" + "DestinationAction" + "?destinationUrl=" + destinationUrl;

        var redirect = new Uri(webConfigParentUrlValue, path).AbsoluteUri;
        ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
        var request = (HttpWebRequest)WebRequest.Create(redirect);

//Ensures that if the user has already signed in to the application,
// their authorisation is carried on through to this new request
        AttachAuthorisedCookieIfExists(request);

        HttpWebResponse result;

        try
        {
            result = (HttpWebResponse)request.GetResponse();
        }
        catch (WebException ex)
        {
            result = ex.Response as HttpWebResponse;
        }

        String responseString;

        using (Stream stream = result.GetResponseStream())
        {
            StreamReader reader = new StreamReader(stream, Encoding.UTF8);
            responseString = reader.ReadToEnd();
        }

        return responseString;
    }

在页面上呈现的错误的更多详细信息:

【问题讨论】:

  • 远程服务器返回错误:(404) Not Found.
  • 感谢您的澄清,我完全错过了粗体字。
  • 我找到了我的问题,但不确定解决方案。查看错误的图像,物理路径是错误的。尽管我的应用程序池/站点指向正确的物理路径,但 IIS 在尝试生成 HttWebRequest.GetResponse() 时却以错误的路径为目标。 D:\webroot\wwwroot\TestWebsite 不包含我在此应用程序中使用的任何代码。它恰好是绑定到 IIS 列表中第一个站点的物理路径。关于它为何尝试定位此站点/物理路径的任何想法?
  • 嗨 Stu,如果您还没有发现问题。我相信这是因为您在 IIS 列表中的第一个站点中绑定了端口 443

标签: c# asp.net-mvc iis ssl web-config


【解决方案1】:

我遇到了类似的情况,但出现了不同的错误消息。我的问题原来是我的 UAT 环境是带有 .NET 4.5 的 Windows 2008。在这种环境中,SSL 握手/检测的执行方式与大多数 Web 浏览器不同。因此,我在 Web 浏览器中看到 URL 呈现没有错误,但我的应用程序会生成错误。我的错误消息包括“底层连接已关闭:发送时发生意外错误”。这可能是您的问题。

我的解决方案是强制更改协议。我检测到特定错误,然后强制更改应用程序的安全协议并重试。

这是我使用的代码:

catch (Exception ex)
{
    if(ex.Message.Contains("The underlying connection was closed: An unexpected error occurred on a send."))
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
        // retry the retrieval
    }
}

【讨论】:

  • 很有意思,我去看看试试看。
  • 恐怕它不起作用@Sam。我已经更新了我的问题,并在页面上呈现了错误的更多详细信息。
【解决方案2】:

我终于找到了解决问题的方法...

让我走上正轨的第一个线索是 IIS 的 404 错误中显示了错误的物理路径。事实证明,这个不正确的物理路径被映射到我的 IIS 设置中的另一个站点。这个特殊的自然也有约束力;端口 443。您可能知道,端口 443 是 https 的默认端口。

现在查看我试图传递给 HTTPWebRequest.GetResponse() 方法的 URL,它看起来像这样:

https://www.my-web-site.com

考虑到这一点,当此应用程序托管在 SSL 范围内的 IIS 上时,出现以下错误:

  1. 代码进入上述方法GetHtmlValues()
  2. 代码从 web.config 文件中获取https://www.my-web-site.com
  3. 请求来自https://www.my-web-site.com 的响应
  4. 此时,由于没有指定端口并且应用程序现在在开放的互联网上,它会尝试从https://www.my-web-site.com:443 获得响应
  5. 问题是,我的应用程序不是通过端口 443 上的 IIS 托管的。一个不同的应用程序存在于此。随后,由于无法在端口 443 上找到该页面,因此产生了 404 错误。

现在解决方案...

  1. 查看 IIS,我找到了我的应用程序所在的端口。假设端口 16523。
  2. 而之前在我的 web.config 中,我的 ParentUrl 的键值被标记为 https://www.my-web-site.com,这将被更改为 http://www.my-web-site.com:16523

注意https 是如何变成http 的,并且端口号是在末尾指定的。现在,当应用程序尝试获取响应时,它不再使用默认的 ssl 端口,因为指定了正确的端口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多