..基础连接已关闭:接收时发生意外错误

时间:2014-02-12 13:03:47

标签: c#

我有以下代码:

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();

请帮帮我

7 个答案:

答案 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;
    }
}

摘自KB915599: You receive one or more error messages when you try to make an HTTP request in an application that is built on the .NET Framework 1.1 Service Pack 1

答案 1 :(得分:1)

这些解决方案都不适用于我。我最终发现的是以下组合:

  • 客户端系统:Windows XP Pro SP3
  • 客户端系统已安装.NET Framework 2 SP1,3,3.5
  • 使用经典Web服务(.asmx)
  • 定位.NET 2的软件
  • 服务器:IIS6
  • 网站“安全通信”设置为:
    • 需要安全通道
    • 接受客户证书

enter image description here

显然,这是导致问题的最后一个选项。我通过尝试直接在Internet Explorer中打开Web服务URL来发现这一点。它只是无限期地挂起试图加载页面。禁用“接受客户端证书”允许页面正常加载。我不确定这个特定系统是否存在问题(可能是一个错误的客户端证书?)因为我没有使用客户端证书,所以这个选项对我有用。

答案 2 :(得分:1)

  • .NET 4.6及更高版本。您无需做任何其他工作即可支持TLS 1.2,默认情况下是支持的。
  • .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

enter image description here

花费大量时间后,请执行以下步骤来解决此问题

  1. 在通话网址之前添加了一行

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

  2. 仍然无法解决问题,然后我将.net版本升级到4.7.2,但我认为它是可选的

  3. 最近的更改是我检查了托管服务器的安全级别,该级别导致使用此“ https://www.ssllabs.com/ssltest/index.html”网站的TLS握手
    并检查请求的URL安全级别,然后发现请求URL必须启用弱级别的密码套件,您可以在下图中看到

enter image description here

现在这是我的支持Cipher Suites的托管服务器

enter image description here

如果您可以控制请求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"

应用上述脚本后,我的托管服务器密码套件级别看起来像

enter image description here

然后我的问题解决了。

注意:不建议您降低服务器安全级别。