Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpWebRequest.GetResponse()返回404错误_C#_Asp.net Mvc_Iis_Ssl_Web Config - Fatal编程技术网

C# HttpWebRequest.GetResponse()返回404错误

C# HttpWebRequest.GetResponse()返回404错误,c#,asp.net-mvc,iis,ssl,web-config,C#,Asp.net Mvc,Iis,Ssl,Web Config,我有一些代码调用HttpWebRequest的GetResponse方法,从URL检索HTML并将其返回给调用方法 这在我的开发和QA环境中工作得非常好,但现在我已将其上传到我的UAT服务器,我不断收到以下错误: 远程服务器返回错误:404未找到 Dev/QA和UAT之间的主要区别在于,UAT使用基于SSL/HTTPS的url,而Dev/QA使用HTTP。我介绍了以下代码行以帮助我进一步提高: ServicePointManager.ServerCertificateValidationCall

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

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


远程服务器返回错误:404未找到

Dev/QA和UAT之间的主要区别在于,UAT使用基于SSL/HTTPS的url,而Dev/QA使用HTTP。我介绍了以下代码行以帮助我进一步提高:

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
其中AcceptillCertifications总是返回true,但我仍然得到404错误

我相信以前犯过这个错误的人能够通过确保用于HttpWebRequest的URI在末尾没有斜杠来解决这个问题,请参见:但这对我来说没有什么区别

我现在已经尝试了这篇文章中的建议,请参见:我在页面上呈现异常的位置。这绕过了黄色警告屏幕,给了我更多的信息,包括它试图从中获取响应的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;
    }
错误在页面上呈现时的更多详细信息:


我遇到了类似的情况,但出现了不同的错误消息。我的问题是我的UAT环境是带有.NET4.5的Windows2008。在此环境中,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
    }
}

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

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

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

https://www.my-web-site.com
考虑到这一点,当此应用程序托管在SSL范围内的IIS上时,出现如下错误:

代码输入前面提到的方法GetHtmlValues 代码变得https://www.my-web-site.com 从web.config文件 我们请求您的回复https://www.my-web-site.com 在这一点上,由于没有指定端口,并且应用程序现在位于开放的internet上,所以它尝试从中获取响应https://www.my-web-site.com:443 问题是,我的应用程序不是通过端口443上的IIS托管的。这里有一个不同的应用程序。随后,由于在端口443上找不到该页面,因此产生404错误。 现在是解决方案

在IIS中,我找到了应用程序所在的端口。比如说16523端口。 而之前在我的web.config中,我将ParentUrl的键标记为https://www.my-web-site.com,这将更改为http://www.my-web-site.com:16523
注意https是如何变成http的,端口号在末尾指定。现在,当应用程序尝试获取响应时,它不再使用默认的ssl端口,因为指定了正确的端口。

远程服务器返回了一个错误:404 Not Found。感谢澄清,我完全错过了粗体文本。我发现了问题,但不确定解决方案。查看错误的图像,物理路径是错误的。虽然我的应用程序池/站点指向了正确的物理路径,但IIS在尝试进行HttWebRequest.GetResponse时指向了错误的路径。D:\webroot\wwwroot\TestWebsite不包含我在此应用程序中使用的任何代码。它恰好是绑定到IIS列表中第一个站点的物理路径。你知道为什么它要把这个站点/物理路径作为目标吗?嗨,斯图,如果你还没有发现问题的话。我相信发生这种情况是因为你在IISVery有趣的列表中的第一个站点绑定了端口443,我会看一看并尝试一下。我担心@Sam不起作用。我已经更新了我的问题,并在页面上呈现了更多错误细节。