¿Por qué el siguiente código de tiempo de espera de la segunda (y posterior) vez que se ejecute?

El código se bloquea en:

using (Stream objStream = request.GetResponse().GetResponseStream())

y, a continuación, hace un WebException diciendo que la petición se ha agotado el tiempo.

He intentado hacer esto con un WebRequest y HttpWebRequest

Edit: parece Que el código está cayendo sobre en request.GetResponse()

Edit: Este post sugiere que puede ser un GC problema –> http://www.vbforums.com/showthread.php?t=610043 – como por este post el problema se soluciona si el Violinista está abierta en segundo plano.

El servidor está ahí y está disponible para las solicitudes.

    private string GetQLMResponse(string URL)
    {
        HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;
        request.Credentials = new NetworkCredential(Settings.Default.LicenseUser, Settings.Default.LicensePassword);
        request.KeepAlive = false;
        request.Timeout = 5000;
        request.Proxy = null;

        //Read stream
        string responseString = String.Empty;
        try
        {
            using (var response = request.GetResponse())
            {
                using (Stream objStream = response.GetResponseStream())
                {
                    using (StreamReader objReader = new StreamReader(objStream))
                    {
                        responseString = objReader.ReadToEnd();
                        objReader.Close();
                    }
                    objStream.Flush();
                    objStream.Close();
                }
                response.Close();
            }
        }
        catch (WebException ex)
        {
            throw new LicenseServerUnavailableException();
        }
        finally
        {
            request.Abort();
            request = null;
            GC.Collect();
        }
        return responseString;
    }

Lanzado WebException es:

{«La operación ha agotado el tiempo»}
[Sistema.Net.WebException]: {«La operación ha agotado el tiempo»}
Datos: {Sistema.Las colecciones.ListDictionaryInternal}
HelpLink: null
InnerException: null
Mensaje: «La operación ha agotado el tiempo»
Fuente: «Sistema»
StackTrace: «en el Sistema.Net.HttpWebRequest.GetResponse()\r\n en IQX.La concesión de licencias.De la licencia.GetQLMResponse(String URL) en C:\Users\jd\SVN\jd\Products\Development\JAD.Licensing\JAD.Licensing\License.cs:line 373»
TargetSite: {Sistema.Net.WebResponse GetResponse()}


Actualización: OK, Así que el siguiente código funciona ahora. El servicePoint fue establecer el tiempo de espera para ser cerca de 4 minutos. El cambio de ServicePoint.ConnectionLeaseTimeout en el objeto request significa que la solicitud se destruye después de 5000ms. Gracias a todos por su ayuda y también a estas 2 páginas:

  1. http://blogs.msdn.com/b/adarshk/archive/2005/01/02/345411.aspx
  2. http://msdn.microsoft.com/en-us/library/6hszazfz(v=VS.80).aspx

    private string GetQLMResponse(string URL)
    {
        HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;
        request.Credentials = new NetworkCredential(Settings.Default.LicenseUser, Settings.Default.LicensePassword);
        request.KeepAlive = false;
        request.Timeout = 5000;
        request.Proxy = null;
    
        request.ServicePoint.ConnectionLeaseTimeout = 5000;
        request.ServicePoint.MaxIdleTime = 5000;
    
        //Read stream
        string responseString = String.Empty;
        try
        {
            using (WebResponse response = request.GetResponse())
            {
                using (Stream objStream = response.GetResponseStream())
                {
                    using (StreamReader objReader = new StreamReader(objStream))
                    {
                        responseString = objReader.ReadToEnd();
                        objReader.Close();
                    }
                    objStream.Flush();
                    objStream.Close();
                }
                response.Close();
            }
        }
        catch (WebException ex)
        {
            throw new LicenseServerUnavailableException();
        }
        finally
        {
            request.Abort();
        }
        return responseString;
    }
  • Alguna razón usted etiquetados con este gc?
  • este post sugiere que puede ser un problema de recolección de basura: vbforums.com/showthread.php?t=610043
  • Oh, gracias por publicar la actualización. Solucionado mi problema.
  • Gracias por publicar la solución. Me salvó un poco de tiempo hoy.
InformationsquelleAutor Darbio | 2011-04-29

7 Comentarios

  1. 27

    En los talones de las respuestas anteriores, quería añadir un par de cosas más. Por defecto HttpWebRequest sólo permite 2 conexiones para el mismo host (esto es HTTP 1.1 «nice»),

    Sí, puede ser anulada, no voy a decirte cómo en esta pregunta, usted tiene que pedir a otro 🙂
    Creo que hay que buscar este post.

    Creo que no son todavía muy disponer de todos sus recursos conectado con el HttpWebRequest, por lo que la agrupación de conexiones entra en el juego y ese es el problema. Yo no tratar de luchar contra el 2 conexiones por servidor regla, a menos que usted realmente tiene que.

    Como uno de los carteles mencionados anteriormente, el Violinista está haciendo un poco de un flaco favor en este caso.

    Me gustaría añadir un bonito finally {} cláusula después de su captura y asegúrese de que como el post anterior notas, todas las corrientes se vacían, cerrado y las referencias al objeto de solicitud se establece en null.

    Por favor, háganos saber si esto le ayuda.

    • Gracias. He intentado forzar el uso de HTTP 1.0. He probado la configuración de la solicitud a null. Y, a continuación, hacer un GC.Collect() – sin ningún éxito.
    • GC.Collect() no debería ser necesario aquí. Creo que, por alguna razón, sus conexiones no se termina correctamente. ¿Has probado 2Sam B sugerencia de usar sólo una simple aplicación de formularios de Windows y reproducir el problema? Es este servicio de conexión a internet o interna? Puede haber alguna restricción en la frecuencia con la que puede conectarse a él desde la misma IP?
    • también trate de hacer netstat -n | find /i "<IPaddress>", donde <IPaddress> es la IP del servicio. Cuántas veces se muestra y en qué estado están las conexiones?
    • 2 conexiones, la respuesta de los netstat-an: TCP 192.168.15.51:57126 175.x.x.x:80 TCP ESTABLECIDAS 192.168.15.51:57128 175.x.x.x:80 TIME_WAIT
    • Servicio de conexión a internet con la autenticación básica
    • esto me dice que las 2 anteriores conexiones establecidas no desaparecen cuando intenta hacer el tercero. Sé que he dicho no voy a compartir esa información en esta pregunta, pero agrega esta línea antes de que usted init HttpWebRequest: ServicePointManager.DefaultConnectionLimit = 3. Algunos más buena información es [disponible aquí](blogs.msdn.com/b/adarshk/archive/2005/01/02/345411.aspx, pero usted necesita saber más acerca de el servidor para tomar ventaja de algunos de los consejos dados en este post. Si ahora son capaces de obtener 3 conexiones antes de el nido, uno se pone en la cola –>
    • configuración de ServicePointManager.DefaultConnectionLimit = 3 (también probado 10) todavía no permite la respuesta para ser leído. Voy a leer ese blog ahora.
    • –> entonces usted está en el camino correcto. Me gustaría mirar otras propiedades en el ServicePointmanagerClass y tratar de cambiarlas. Sólo las conexiones obtener elibible para GC cuando su vida está caducado, por lo tanto el consejo de no llamar a la GC.Recoger usted mismo. Yo diría que este consejo no es algo que me gustaría hacer en la producción, pero podría ser beneficioso para la solución de su problema.
    • pruebe a desactivar TCPKeepAlive en el ServicePointManager, estableciendo la adecuada tiempos de espera, etc. Todavía pienso que es algo extraño aquí, y el servidor no está RFC2616-compatible o hay algún tipo de extraño proxy inverso en frente de ella o no hay conexión de estrangulación en el lugar en el lado del servidor.
    • Gracias, yo ahora tengo trabajo mediante la request.ServicePoint clase y la configuración de las propiedades que. Esto también fue de ayuda –> msdn.microsoft.com/en-us/library/6hszazfz(v=VS.80).aspx
    • El servidor IIS 7.5 y ‘debe’ ser compatibles. Ahora está trabajando por la alteración de los tiempos de espera de 5 segundos. Gracias por tu ayuda 🙂
    • por cierto, el Punto de Servicio expuesto es creado por la fábrica en ServicePointManager. Me alegro de que tengo trabajo! Siempre es muy frustrante cuando usted está atascado con un problema como ese.

  2. 21

    La WebResponse obtenidos por request.GetReponse() DEBEN ser eliminados adecuadamente. Intenta esto (la eliminación de request.Abort() y GC.Collect() llamadas):

    using (var wresponse = request.GetResponse())
    {
       using (Stream objStream = wresponse.GetResponseStream())
       {
            //...
       }
    }

    Editar:
    Dado que todavía no funciona, te sugiero que para probar esto con un vacío de aplicación de windows. De esta manera, se podrían aislar de la aplicación.config problemas o número máximo de llamadas simultáneas por host* (estás usando otro objeto webrequest en alguna otra parte en su aplicación a este host; que webresponse no se desechan correctamente?).

    Espero que esto solucione tu problema, yo soy de ideas!

    • Ver Jon Skeet la respuesta de aquí.
    • Gracias, pero esto todavía está causando el mismo problema. He actualizado el código fuente de arriba para reflejar sus sugerencias.
    • AFAIK WebResponse no implementa IDisposable.
    • Sí, así es. Clase WebResponse firma: public abstract class WebResponse : MarshalByRefObject, ISerializable, IDisposable (msdn.microsoft.com/en-us/library/…). Howver, WebRequest NO implementa IDisposable.
    • Puedes publicar el mensaje de Excepción atrapado en su try-catch (con el código actualizado)?
    • Acepto la corrección, no podía ver al método Dispose en Intelisense… Simplemente posicionando excepción de arriba.
    • Usted no está viendo un método Dispose porque la interfaz IDisposable está Explícitamente implementado.
    • No Cerrar correctamente() la respuesta es la única causa de este problema que he visto en los últimos años.
    • Se puede ver cómo estoy no cierre la respuesta? Estoy sospechando que la petición es la única cosa que podría estar causando un problema ya que es el único objeto de no eliminarse?
    • Las únicas cosas que es desechable (y que debe ser eliminado) es la Respuesta. Probar mi última edición, y deshabilitar el Violinista. El tiempo de espera se establece en 5 segundos, puede que el servidor tome más de 5 segundos para responder?
    • No, el servidor responde dentro de 100ms en todo momento. Fiddler es cerrado. La respuesta es la de ser eliminados.
    • Esta es una aplicación independiente de windows ahora. Todavía mismos problemas
    • Gracias – simplemente desechar el objeto de respuesta fija este problema para mí

  3. 8

    Como usted ha indicado, la ejecución de » el violinista en el fondo mitigar el problema. Esto es debido a que el violinista de la fuerza se cierra ninguna de las respuestas. Se extiende en el post anterior de Sam B, me gustaría asegurarse de que la respuesta se cierra así:

    using (var wresponse = request.GetResponse())
    {
       using (Stream objStream = wresponse.GetResponseStream())
       {
            //...
       } 
       wresponse.close();
    }

    También puede ser vale la pena establecer que el apoderado null así:

     request.Proxy = Null;

    Como el .NET framework va a ir en la búsqueda de un proxy a menos que explícitamente a ello. Cuando el violinista se está ejecutando este efecto sería mitigado como violinistas proxy se encontraría directamente.

    • Esto no está ayudando a resolver el problema.
    • Esto es muy extraño. Lo único que puedo sugerir es esta revisión de Phil Haak: haacked.com/archive/2004/05/15/…
    • Gracias, sólo traté de todos de que, de no obtener la misma encabezados como son..
    • Su respuesta me pareció el más improbable para mí, pero es lo que pasó – me olvidé de cerrar la respuesta en una función diferente (yo ni siquiera estaba mirando allí).
  4. 5

    topó con el mismo problema con los tiempos de espera en las siguientes solicitudes al servidor, a pesar de disponer de lavado/cierre a todo correctamente. tratar de tirar de su grupo de conexión, trabajó para mí:

    myRequest.ServicePoint.CloseConnectionGroup(myRequest.ConnectionGroupName);

    también, asegúrese de que usted no está inadvertidamente de la creación de otros HttpWebRequest y objetos de Solicitud en el resto de aplicaciones que no están siendo correctamente terminados/desecharse, ya que esto aumentará el número de conexiones en el Punto de Servicio.

  5. 1

    Tuve el mismo problema y lo resolvió asegurar que yo llamo el Abort() método en cada una de la solicitud objeto creado.

  6. 0

    Por casualidad se está utilizando una aplicación de prueba con el nombre predeterminado de WindowsFormsAppN? Yo tenía el mismo problema que yo pasamos una semana de depuración, ya que trabajó en mi código de la producción, pero no en una simple prueba de solución que se estaba construyendo. Al final, he decidido que este comportamiento fue el único que utiliza el valor predeterminado nombre de la solución en lugar de una nombrado correctamente solución.

    Edit: he descubierto que mi problema estaba relacionado con el uso de BitDefender como el software de AV. El WindowsFormsAppN programas fueron bloqueados todos.

  7. -3

    Me he fijado http tiempo para 10 minutos y trabajó para mí.

    Ajuste a timeout=infinite estaba tomando más tiempo y mi programa iba en hung modo.

Dejar respuesta

Please enter your comment!
Please enter your name here