当我从控制台应用程序运行以下代码时,它可以正常运行。
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::有些网站建议假冒,但无效:(
答案 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);