获取EOF例外通过https通话获取EOF例外通过https通话(Getting EOF excep

2019-05-12 06:52发布

我的代码进行HTTPS请求。 这是我的代码

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(UploadUrl);
            request.Method = "POST";
            request.KeepAlive = false;
            request.Credentials = new NetworkCredential(userid, testpwd);

            postData = "<root></root>";
            request.ContentType = "application/x-www-form-urlencoded";

            byte[] postDataBytes = Encoding.UTF8.GetBytes(postData);
            request.ContentLength = postDataBytes.Length;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(postDataBytes, 0, postDataBytes.Length);
            requestStream.Close();

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                StreamReader responseReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                var result = responseReader.ReadToEnd();
                responseReader.Close();
                Console.WriteLine(result);
            }

此代码是运行良好,但突然投掷以下异常

 System.Net.WebException 

异常消息为:基础连接已关闭:上一个发送发生意外的错误。

堆栈跟踪:在在System.Net.HttpWebRequest.GetRequestStream()System.Net.HttpWebRequest.GetRequestStream(TransportContext&上下文)在CustomerProcessor.Delivery.Deliver(字符串的内容,的Int32产品分类,字符串标识符,字符串xsltFile)

异常具有内异常:一个异常发生信息:System.IO.IOException异常消息是:收到从传输流意外EOF或0字节。

堆栈跟踪:在System.Net.FixedSizeReader.ReadPacket(字节[]缓冲液,的Int32偏移的Int32计数)在System.Net.Security.SslState.StartReadFrame(字节[]缓冲液,的Int32的ReadBytes,AsyncProtocolRequest asyncRequest)在System.Net。 Security.SslState.StartReceiveBlob(字节[]缓冲液,AsyncProtocolRequest asyncRequest)在System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken消息,AsyncProtocolRequest asyncRequest)在System.Net.Security.SslState.StartSendBlob(字节[]来电,的Int32计数, AsyncProtocolRequest asyncRequest)在System.Net.Security.SslState.ForceAuthentication(布尔receiveFirst,字节[]缓冲液,AsyncProtocolRequest asyncRequest)在System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)在System.Net.TlsStream.CallProcessAuthentication(对象状态)在System.Threading.ExecutionContext.runTryCode(对象的UserData)在System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode代码,CleanupCode backoutCode, 对象的UserData)在System.Threading.ExecutionContext.RunInternal(的ExecutionContext的ExecutionContext,ContextCallback回调,对象状态)在System.Threading.ExecutionContext.Run(的ExecutionContext的ExecutionContext,ContextCallback回调,在System.Net.TlsStream.ProcessAuthentication对象状态)(LazyAsyncResult结果)
在System.Net.TlsStream.Write(字节[]缓冲液,的Int32偏移的Int32大小)在System.Net.PooledStream.Write(字节[]缓冲液,的Int32偏移的Int32大小)在System.Net.ConnectStream.WriteHeaders(布尔异步)

是否有机会,看看有什么可能是这个问题的原因是什么?

Answer 1:

添加此调用之前请求帮助我:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

所以,如果你使用的是HTTPS尝试更改默认SecurityProtocol。



Answer 2:

这样做的另一个潜在原因 - 如果你在Windows Server 2003上运行它仅支持SSL 2.0,SSL 3.0,TLS 1.0。 所有这些协议现在推荐已经发现了这些协议最近战功光被禁用,所以你会发现,只是无法从Windows Server 2003连接到一个高度安全的服务器,而这将是罚款从你的开发机。 有什么可以真正做到对这种情况多问目标服务器管理员的团队,让TLS1.0,或升级您的生产服务器等。

对Win2k3Server SSL支持来源: http://blogs.msdn.com/b/kaushal/archive/2011/10/02/support-for-ssl-tls-protocols-on-windows.aspx



Answer 3:

我的经验是一样elRobbo描述。 我需要升级WIN2K3服务器Win2k8。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 

仅支持.NET 4.5,这是不支持WIN2K3 ...



Answer 4:

这为我工作:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

我已经把该行创建Web请求之前。



Answer 5:

我不知道为什么(尤其是因为它违背了文档我已经看到对此事的),但我发现,留出的分配RequestLength 。 相反,只写于该请求流,而不设置集管。

这还具有以下优势:

using(Stream stm = req.GetRequestStream())
using(StreamWriter sw = new StreamWriter(stm))
{
  sw.Write(postData);
}

是我的脑海里简单地使用的情况下具有较大的优势,其中的数据是更大一块一块写的,或来自类似的沿XMLWriter可以设立直写有问题的数据流。



文章来源: Getting EOF exception over https call
标签: .net http