HttpWebRequest / HttpWebResponse仅适用于控制台应用程序,不适用于ASP.NET

时间:2019-04-10 19:05:40

标签: c# asp.net httpwebrequest httpwebresponse

当我从控制台应用程序运行以下代码时,它可以正常运行。

        Uri prereqUri = new Uri(PREREQ_URL);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(prereqUri);

        request.PreAuthenticate = true;
        request.Headers.Add(HttpRequestHeader.Authorization, authorization);
        request.Method = "POST";
        request.KeepAlive = true;

        string responseString = "";
        using (var response = (HttpWebResponse)request.GetResponse())
        {
            responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
        }

但是,当我从ASP.NET运行相同的代码时,会得到:

“ System.IO.IOException无法从传输连接中读取数据:现有连接已被远程主机强行关闭。”
在var response =(HttpWebResponse)request.GetResponse()

请提出任何想法。

更新:远程端看不到我们通过ASP.NET发送的数据,因此问题肯定在发送方。
更新2::有些网站建议假冒,但无效:(

3 个答案:

答案 0 :(得分:1)

我在ASP.NET应用程序中使用HttpWebRequest,并且工作正常。

基于您在Fiddler中看到的错误,我会说这是HTTPS证书验证或默认安全协议存在的问题。在控制台应用程序中运行代码时,可能会应用不同的默认策略,这就是为什么它可以在其中运行的原因。 尝试将这些行添加到 WebRequest.Create(..)

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

    // Skip validation of remote server's SSL/TLS certificate
    ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

答案 1 :(得分:0)

还没有找到更好的解决方案,并且有代码发布的最后期限,我只是从ASP.NET代码中调用控制台应用程序。解决方案如下

    ProcessStartInfo startInfo = new ProcessStartInfo
    {
        FileName = @"C:\Debug\ConsoleApp.exe",
        UseShellExecute = false,
        RedirectStandardOutput = true,

        Arguments = PREREQ_URL + " " + basicUserName
    };
    if (basicPassword.Length > 0) startInfo.Arguments += " " + basicPassword;

    string responseString = Process.Start(startInfo).StandardOutput.ReadLine();
    return responseString;

我意识到这不是理想的解决方案,如果有人建议使用更好的方法,则会删除/修改此答案。

答案 2 :(得分:0)

我遇到了同样的问题,并通过如下设置httpwebrequest的代理进行了解决。

httpRequest.Proxy = new WebProxy(hostname, portno);