【问题标题】:Http post error: An existing connection was forcibly closed by the remote hostHttp post 错误:一个现有的连接被远程主机强行关闭
【发布时间】:2015-04-11 18:21:48
【问题描述】:

我知道有很多类似的帖子,但我还没有找到解决方案。我正在尝试将一些 xml 发布到 MPI 网关,但不断收到以下错误:

无法从传输连接读取数据:现有 连接被远程主机强行关闭。

以下是我目前正在使用的代码,但我尝试了几乎所有我能想到的不同方法,它们都返回相同的错误:

        string result = "";

        string xml = "<TNSAuthRequest><CardNumber>0123456789</CardNumber><ExpiryDate>1801</ExpiryDate><PurchaseAmt>750</PurchaseAmt><CurrencyCode>826</CurrencyCode><CurrencyExponent>2</CurrencyExponent><CountryCode>826</CountryCode><MerchantName>Mayflower</MerchantName><MerchantId>0123456789</MerchantId><MerchantData>abcdefghijklmnopqrstuvwxyz0123456789</MerchantData><MerchantUrl>example.com</MerchantUrl><NotificationURL>example.com/basket</NotificationURL></TNSAuthRequest>";

        var url = "https://mpi.securecxl.com";
        byte[] bytes = System.Text.Encoding.ASCII.GetBytes("xmldata=" + xml.ToString());

        ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(ValidateRemoteCertificate);

        var req = (HttpWebRequest)WebRequest.Create(url);
        req.AllowWriteStreamBuffering = true;
        req.ContentType = "text/xml";
        req.Method = "POST";
        //req.ContentLength = bytes.Length;
        req.KeepAlive = false;
        req.ProtocolVersion = HttpVersion.Version10;
        req.ServicePoint.ConnectionLimit = 1;
        //req.Timeout = -1;

        try
        {
            using (var writer = new StreamWriter(req.GetRequestStream(), Encoding.ASCII))
            {
                writer.WriteLine(bytes);
            }
            using (WebResponse resp = req.GetResponse())
            {
                using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
                {
                    result = sr.ReadToEnd().Trim();
                }
            }
        }
        catch (Exception ex)
        {
            result = ex.Message + "<br />" + ex.InnerException.Message + "<br /><br />" + xml.Replace("<", "&lt;");
        }

        ViewBag.result = result;

如果有人能看到可能导致此错误的代码有任何问题,或者我最有可能遇到问题,那我基本上是在徘徊?尝试在我的本地主机、我们的实时服务器和我自己的私有服务器(使用完全不同的 IP)上运行,仍然得到相同的结果。

有什么想法吗?

【问题讨论】:

  • 您是否运行过服务跟踪查看器工具? msdn.microsoft.com/en-us/library/ms732023.aspx ...另请阅读stackoverflow.com/questions/7209823/…
  • 已经尝试过服务跟踪查看器,但没有发现任何有用的信息。没有显示任何错误,
  • 很可能您的标头或编码不正确。是否有网站或其他方法已经这样做并且您正在尝试模仿它?还是您只是提供了诸如“只需将 xml 发布到此 url 并且一切都应该正常”之类的说明?如果有手动执行此操作的现有方法,那么我建议以手动方式执行此操作,但使用工具查看正在发送的标头,然后在您的代码中您必须尽可能模拟标头和格式。以这种方式发布数据可能非常棘手,而且提前查看标题确实很有帮助。
  • 感谢人们的帮助,结果即使我多次要求提供商验证目标 url,他们给了我错误的 url。我不高兴。

标签: c# asp.net httpwebrequest http-post


【解决方案1】:

我认为这是因为您正在连接到“https”网址。在这种情况下,您必须在代码中添加以下行。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

它将接受您的请求的“ssl”协议。 “ServicePointManager.ServerCertificateValidationCallback”处理程序只控制证书有效性。

【讨论】:

  • 我成功使用了 2 年的 Web 服务在星期五突然停止工作。事实证明这是解决方案。网络主机在周五下午 4 点禁用了 TLS 1.0,没有任何警告。
  • 我的代码正在使用单元测试,但一旦由 IIS/IIS Express 托管就失败了。这解决了它。
  • 这真的很有帮助。在我们公司,他们关闭了除 TLS1.2 之外的所有内容
  • 它也解决了我的问题 :) 我的主机 API 也突然停止工作。看来他也升级了 TLS 版本。
  • 我也在 2019 年 :)
【解决方案2】:

也许稍微好一点:

System.Net.ServicePointManager.SecurityProtocol = System.Net.ServicePointManager.SecurityProtocol | System.Net.SecurityProtocolType.Tls12;

【讨论】:

    【解决方案3】:

    @AlisettarHuseynli 是对的,这有时与https 有关。最有可能发生在基础架构得到更新时,这可能意味着 TLS 得到更新,例如从 TLS1.0 更新到 TLS1.2 通常发生在某些 API 等情况下。

    如果您尝试访问的服务可以通过http 访问,请执行此操作。将方案从 https 更改为 http。在我的情况下工作。否则,您必须添加代码以支持更高版本的TLS。流行的软件通常有一个选择加入选项来使用TLS1.2,而不是旧的TLS1.0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 2021-05-12
      相关资源
      最近更新 更多