2011-03-21 19 views
11

Mi código hace la solicitud https. Este es mi códigoObteniendo la excepción EOF sobre la llamada 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); 
      } 

Este código se ejecuta buena pero de lanzamiento repentino siguiente excepción

System.Net.WebException 

El mensaje de excepción es: la conexión subyacente se cerró: Se ha producido un error inesperado en un envío.

Seguimiento de la pila: en System.Net.HttpWebRequest.GetRequestStream (TransportContext & contexto) en System.Net.HttpWebRequest.GetRequestStream() en CustomerProcessor.Delivery.Deliver (contenido String, Int32 ProductCategory, identificador de cadena , cadena xsltFile)

la excepción tiene una excepción interna: se produjo una excepción: System.IO.IOException el mensaje de excepción es: recibido una inesperadas bytes EOF o 0 de la corriente de transporte.

Seguimiento de la pila: en System.Net.FixedSizeReader.ReadPacket (byte [] buffer, Int32 compensado, recuento Int32) en System.Net.Security.SslState.StartReadFrame (byte [] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) en System.Net.Security.SslState.StartReceiveBlob (byte [] buffer, AsyncProtocolRequest asyncRequest) en System.Net.Security.SslState.CheckCompletionBeforeNextReceive (mensaje ProtocolToken, AsyncProtocolRequest asyncRequest) en System.Net.Security.SslState.StartSendBlob (Byte [] entrante, conteo Int32, AsyncProtocolRequest asyncRequest) en System.Net.Security.SslState.ForceAuthentication (Boolean receiveFirst, Byte [] buffer, AsyncProtocolRequest asyncRequest) en System.Net.Security.SslState.ProcessAuthentication (LazyAsyncResult lazyResult) en System.Net.TlsStream.CallProcessAuthentication (estado Object) en System.Threading.ExecutionContext.runTryCode (Object userData) en System.Runtime.CompilerServices.RuntimeHelpers .ExecuteCodeWithGuaranteedCleanup (Código TryCode, CleanupCode backoutCode, Object userData) en System.Threading.ExecutionContext.RunInternal (ExecutionContext executionContext, ContextCallback callback, Estado del objeto) en System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback callback, Estado del objeto) en System.Net.TlsStream.ProcessAuthentication (resultado LazyAsyncResult) en System.Net.TlsStream.Write (Byte [] búfer, desplazamiento Int32, tamaño Int32) en System.Net.PooledStream.Write (byte [] buffer, Int32 compensado, tamaño Int32) en System.Net.ConnectStream.WriteHeaders (asíncrono de Boole)

¿Hay alguna posibilidad de ver lo que podría ser la causa de este ¿problema?

Respuesta

17

La adición de esta llamada antes petición me ayudó:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 

Así que si usted está utilizando https tratan de cambiar el SecurityProtocol defecto.

+0

Esto acaba de salvar mi día ... aparentemente todavía hay sitios web corriendo en SSL2.0. – Grubsnik

0

No tengo idea de por qué (especialmente porque va en contra de los documentos que he visto al respecto) pero he encontrado que omitiendo la asignación de RequestLength. Más bien, simplemente escriba en la secuencia de solicitud sin configurar el encabezado.

Esto también tiene la ventaja de que:

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

es a la mente más simple, además de tener mayores ventajas en los casos en los datos es mayor y la pieza escrita por pieza, o procede de algo así como un XMLWriter que se puede configurar para escribir directamente en la transmisión en cuestión.

10

Otra posible causa de esto: si está ejecutando en Windows Server 2003, solo es compatible con SSL 2.0, SSL 3.0, TLS 1.0. Ahora se recomienda que todos estos protocolos se deshabiliten a la luz de los exploits recientes que se han encontrado para estos protocolos, por lo que es posible que un servidor fuertemente seguro no se pueda conectar desde el servidor de Windows 2003, pero estará bien desde su máquina de desarrollo. No hay nada que realmente pueda hacer con respecto a esta situación, salvo pedirle al equipo del administrador del servidor de destino que permita TLS1.0 o actualizar su servidor de producción.

Fuente de soporte SSL en Win2k3Server: http://blogs.msdn.com/b/kaushal/archive/2011/10/02/support-for-ssl-tls-protocols-on-windows.aspx

+0

Usted señor es un genio y le debo una cerveza. ¡Gracias! –

+3

¿Alguna vez ha comprado esa cerveza? –

1

Mi experimentado es tan elRobbo descrito. Tengo que actualizar el servidor Win2k3 a Win2k8.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 

sólo se admite en .NET 4.5, que no se apoya en Win2k3 ...

0

Esto funcionó para mí:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

he puesto esa línea antes de crear la solicitud Web .

Cuestiones relacionadas