Получение исключения EOF через вызов https - PullRequest
15 голосов
/ 21 марта 2011

Мой код делает запрос 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 (TransportContext & context) в System.Net.HttpWebRequest.GetRequestStream () в CustomerProcessor.Delivery.Deliver (Строковый контент, Int32 productCategory, строковый идентификатор, строковый xsltFile)

Исключение имеет внутреннее исключение: произошло исключение: System.IO.IOException Сообщение об исключении: Получено неожиданное EOF или 0 байтов из транспортного потока.

Трассировка стека: в System.Net.FixedSizeReader.ReadPacket (Byte [] буфер, смещение Int32, количество Int32) в System.Net.Security.SslState.StartReadFrame (буфер Byte [], Int32 readBytes, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.StartReceiveBlob (буфер Byte [], AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.CheckCompletionBeforeNextReceive (ProtocolToken сообщение, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.StartSendBlob (Byte [] входящий, 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 (Object userData) в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (TryCode код, CleanupCode backoutCode, Object userData) в System.Threading.ExecutionContext.RunInternal (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Net.TlsStream.ProcessAuthentication (результат LazyAsyncResult)
в System.Net.TlsStream.Write (буфер Byte [], смещение Int32, размер Int32) в System.Net.PooledStream.Write (буфер Byte [], смещение Int32, Int32). размер) в System.Net.ConnectStream.WriteHeaders (логическое асинхронное)

Есть ли шанс узнать, что может быть причиной этой проблемы?

Ответы [ 5 ]

21 голосов
/ 03 сентября 2012

Добавление звонка до запроса помогло мне:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Поэтому, если вы используете https, попробуйте изменить протокол безопасности по умолчанию.

11 голосов
/ 22 октября 2014

Другая потенциальная причина этого - если вы работаете в Windows Server 2003, он поддерживает только SSL 2.0, SSL 3.0, TLS 1.0.Все эти протоколы теперь рекомендуется отключить в свете недавних эксплойтов, обнаруженных для этих протоколов, поэтому вы можете обнаружить, что к жестко защищенному серверу просто невозможно подключиться с Windows Server 2003, тогда как с вашим сервером все будет в порядке.разработка машины.В этой ситуации вы ничего не можете сделать, кроме как попросить команду администратора конечного сервера разрешить TLS1.0 или обновить рабочий сервер.

Источник поддержки SSL на Win2k3Server: http://blogs.msdn.com/b/kaushal/archive/2011/10/02/support-for-ssl-tls-protocols-on-windows.aspx

3 голосов
/ 17 марта 2016

Это сработало для меня:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Я поставил эту строку перед созданием веб-запроса.

2 голосов
/ 12 марта 2015

Мой опытный, как описано в elRobboЯ должен обновить сервер Win2k3 до Win2k8.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 

поддерживается только в .net 4.5, который не поддерживается в Win2k3 ...

0 голосов
/ 21 марта 2011

Понятия не имею почему (тем более, что это идет вразрез с документами, которые я видел по этому вопросу), но я обнаружил, что опуская назначение RequestLength. Скорее, просто напишите в поток запросов без установки заголовка.

Это также имеет то преимущество, что:

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

, на мой взгляд, проще, наряду с большими преимуществами в случаях, когда данные больше и записываются по частям или поступают из чего-то вроде XMLWriter, который можно настроить для прямой записи в рассматриваемый поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...