我有以下代码:
private Uri currentUri;
private void Form1_Load(object sender, EventArgs e)
{
currentUri = new Uri(@"http://www.stackoverflow.com");
HttpWebRequest myRequest = (HttpWebRequest) HttpWebRequest.Create("http://www.stackoverflow.com");
WebProxy myProxy = new WebProxy("120.198.230.8:81");
myRequest.Proxy = myProxy;
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
webBrowser1.DocumentStream = myResponse.GetResponseStream();
webBrowser1.Navigating += new WebBrowserNavigatingEventHandler(webBrowser1_Navigating);
}
void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
if (e.Url.AbsolutePath != "blank")
{
currentUri = new Uri(currentUri, e.Url.AbsolutePath);
HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(currentUri);
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
webBrowser1.DocumentStream = myResponse.GetResponseStream();
e.Cancel = true;
}
}
编译后:
错误:类型为“System.Net.WebException”的未处理异常 发生在System.dll
中其他信息:基础连接已关闭:An 接收时发生意外错误。
在第HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
行
请帮帮我
答案 0 :(得分:16)
基础连接已关闭:接收时发生意外错误。
当服务器或其他网络设备出现此问题 意外关闭现有的传输控制协议(TCP) 连接。当超时值出现时,可能会出现此问题 服务器或网络设备设置得太低。要解决这个问题 问题,请参阅分辨率A,D,E,F和O.问题也可以 如果服务器意外重置连接,则会发生,例如 未处理的异常导致服务器进程崩溃。分析服务器 记录是否存在这个问题。
解决强>
要解决此问题,请确保您使用的是最新版本的.NET Framework。
向类添加方法以覆盖GetWebRequest
方法。此更改允许您访问HttpWebRequest对象。如果您使用的是Microsoft Visual C#,则新方法必须类似于以下内容。
class MyTestService:TestService.TestService
{
protected override WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest webRequest = (HttpWebRequest) base.GetWebRequest(uri);
//Setting KeepAlive to false
webRequest.KeepAlive = false;
return webRequest;
}
}
答案 1 :(得分:1)
这些解决方案都不适用于我。我最终发现的是以下组合:
显然,这是导致问题的最后一个选项。我通过尝试直接在Internet Explorer中打开Web服务URL来发现这一点。它只是无限期地挂起试图加载页面。禁用“接受客户端证书”允许页面正常加载。我不确定这个特定系统是否存在问题(可能是一个错误的客户端证书?)因为我没有使用客户端证书,所以这个选项对我有用。
答案 2 :(得分:1)
.NET 4.5。支持TLS 1.2,但它不是默认协议。您需要选择使用它。以下代码将TLS 1.2设置为默认值,请确保在连接到安全资源之前执行它:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
.NET 4.0。不支持TLS 1.2,但是如果系统上安装了.NET 4.5(或更高版本),那么即使您的应用程序框架不支持TLS 1.2,您仍然可以选择使用TLS 1.2。唯一的问题是.NET 4.0中的SecurityProtocolType没有TLS1.2的条目,因此我们必须使用此枚举值的数字表示形式:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
.NET 3.5或更低版本。不支持TLS 1.2。将您的应用程序升级到该框架的最新版本。
答案 3 :(得分:0)
在执行查询之前,我按如下所示放置了语句,它解决了我的错误。 仅供参考,以防万一。
ServicePointManager.SecurityProtocol =(SecurityProtocolType)3072; ctx.ExecuteQuery();
答案 4 :(得分:0)
我也在从事网络抓取项目,并且发现了相同的问题,下面的代码得到了应用,并且效果很好。如果您不了解TLS版本,则可以在下面应用所有内容,否则可以应用特定内容。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
答案 5 :(得分:0)
要扩展Bartho Bernsmann的answer,我想补充一点,可以花点时间思考就可以实现一种通用的,面向未来的实现方式:
static void AllowAllSecurityPrototols()
{ int i, n;
Array types;
SecurityProtocolType combined;
types = Enum.GetValues( typeof( SecurityProtocolType ) );
combined = ( SecurityProtocolType )types.GetValue( 0 );
n = types.Length;
for( i = 1; i < n; i += 1 )
{ combined |= ( SecurityProtocolType )types.GetValue( i ); }
ServicePointManager.SecurityProtocol = combined;
}
我在访问互联网的类的静态构造函数中调用此方法。
答案 6 :(得分:0)
我的托管服务器阻止请求URL和代码站点出现相同错误
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
花费大量时间后,请执行以下步骤来解决此问题
在通话网址之前添加了一行
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
仍然无法解决问题,然后我将.net版本升级到4.7.2,但我认为它是可选的
最近的更改是我检查了托管服务器的安全级别,该级别导致使用此“ https://www.ssllabs.com/ssltest/index.html”网站的TLS握手
并检查请求的URL安全级别,然后发现请求URL必须启用弱级别的密码套件,您可以在下图中看到
现在这是我的支持Cipher Suites的托管服务器
如果您可以控制请求URL主机服务器,则可以调用
,则可以同步这两个服务器的密码套件。但就我而言,这是不可能的,因此我在托管服务器上的Windows PowerShell中应用了以下脚本,以启用所需的弱级别密码套件。
Enable-TlsCipherSuite -Name "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384"
Enable-TlsCipherSuite -Name "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"
Enable-TlsCipherSuite -Name "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"
Enable-TlsCipherSuite -Name "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"
Enable-TlsCipherSuite -Name "TLS_DHE_RSA_WITH_AES_256_CBC_SHA"
Enable-TlsCipherSuite -Name "TLS_DHE_RSA_WITH_AES_128_CBC_SHA"
Enable-TlsCipherSuite -Name "TLS_RSA_WITH_AES_256_GCM_SHA384"
Enable-TlsCipherSuite -Name "TLS_RSA_WITH_AES_128_GCM_SHA256"
Enable-TlsCipherSuite -Name "TLS_RSA_WITH_AES_256_CBC_SHA256"
Enable-TlsCipherSuite -Name "TLS_RSA_WITH_AES_128_CBC_SHA256"
Enable-TlsCipherSuite -Name "TLS_RSA_WITH_AES_256_CBC_SHA"
Enable-TlsCipherSuite -Name "TLS_RSA_WITH_AES_256_CBC_SHA"
应用上述脚本后,我的托管服务器密码套件级别看起来像
然后我的问题解决了。
注意:不建议您降低服务器安全级别。