2008-11-19 34 views
14

Necesito una forma de llamar a una página web desde mi aplicación .net.Llamar a una página web desde C# en el código

Pero solo quiero enviar una solicitud a la página y no preocuparme por la respuesta.

Como hay momentos en que la respuesta puede llevar un tiempo, por lo que no quiero que cuelgue la aplicación.

que han estado tratando de lado el evento Page_Load

WebClient webC = new WebClient(); 
Uri newUri = new Uri("http://localhost:49268/dosomething.aspx"); 
webC.UploadStringAsync(newUri, string.Empty); 

A pesar de que su conjunto a asíncrono, todavía costuras para colgar como la página de costumbre prestación acabado hasta que las roscas han finsished

Respuesta

12

Doak, casi estaba allí, pero cada vez que puse cualquiera de las peticiones en un subproceso sepreate, la página no se procesaba hasta que todo el subproceso había terminado de ejecutarse.

La mejor manera que encontré fue ajustar el método de Doak, y simplemente poner un tiempo fuera allí y tragar el error.

Sé que es un truco, pero funciona: P

WebRequest wr = WebRequest.Create("http://localhost:49268/dostuff.aspx"); 
wr.Timeout = 3500; 

try 
{ 
    HttpWebResponse response = (HttpWebResponse)wr.GetResponse(); 
} 
catch (Exception ex) 
{ 
    //We know its going to fail but that dosent matter!! 
} 
+0

He encontrado que es mejor darle 3-5 segundos para el tiempo de espera. – TheAlbear

+1

Ajuste el bloque catch si desea saber si el tiempo de espera fue el motivo de la excepción: 'catch (WebException ex) {if (ex.Status! = WebExceptionStatus.Timeout) throw ex; } ' –

9

Para que su aplicación no se cuelgue, deberá llamar al método desde un subproceso.

Para la petición HTTP sin una respuesta, algo así como que debe hacer el trabajo:

Thread myThread = new Thread(new ThreadStart(myMethodThatDoHttp)); 
    myThread.Start(); 
public void myMethodThatDoHttp() 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www..com"); 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
} 
2

Uso System.Net.WebClient.DownloadDataAsync/DownloadFileAsync conjuntamente con DownloadDataCompleted/DownloadFileCompleted.

+0

Esto todavía hace que el subproceso de llamada se bloquea hasta que el hilo asíncrono ha terminado .. no debería, pero lo hace:/ – TheAlbear

13

Esto debería funcionar para usted:

System.Net.WebClient client = new System.Net.WebClient(); 
client.DownloadDataAsync(new Uri("http://some.url.com/some/resource.html")); 

La clase WebClient tiene eventos para notificar a la persona que llama cuando la solicitud se ha completado, pero ya no le importa que no debería haber nada más que decir.

+0

Estoy de acuerdo que debería funcionar, pero la página web suele representar de nuevo a la broswer hasta que las roscas tienen terminado, por lo que todavía cuelga – TheAlbear

3

Para tener este proceso sin interrumpir el flujo de páginas de su página actual, le recomendaría crear un servicio WCF que ejecutará el código por usted. Haga que el servicio se configure para utilizar llamadas de 1 vía y en la página inicie una llamada Ajax al servicio.

+0

Me gusta mi servicio y el sitio web en el mismo proyecto y cansado el uno al otro, el problema con cualquier servicio de Windows es que 1. se puede bloquear, ¿escribes un segundo servicio para atrapar el bloqueo? captura 22 y no hay dependencia cansada si mueves servidores/hosts, el servidor se restablece a través de tu ISP, el servicio puede olvidarse fácilmente. – TheAlbear

+0

WCF a menudo se aloja dentro de IIS, por lo que a veces es posible que un dominio de aplicación pueda bloquear ASP.NET y tal vez perder una solicitud o 2, lo que no ocurre muy a menudo. No estoy seguro de lo que la 2da parte está pidiendo –

2
  1. Por lo que yo puedo ver el 'BeginGetResponse'-método y el' EndGetResponse'-método de la HttpWebRequest a objetos (obtenido a través de la llamada de WebRequest.Create), resp. los métodos BeginGetRequestStream-/EndGetRequestStream, aquí no se reflejan todavía, - a pesar de que se EXLPLICITLY marcados para una "petición asincrónico" en la documentación:

    Ni idea, cómo funciona eso

  2. Si la página para llamar está en la misma IIS/Aplicación.como la llamada, podría escribir un Filtro, que finaliza todo el servicio para esta solicitud al cliente (Su 'llamada' aspx-página), si la cadena del mapa contiene la especificación para que la página llame (en ISAPI-cpp: "return SF_STATUS_REQ_FINISHED; ") Pero quizás tu ejecución asp/x/-script en la página llamada también se elimine. Pregunta de verificación.

  3. Considere el uso de las directivas de inclusión del lado del servidor (menos condicionables) o llame dinámicamente a un archivo .asp utilizando Server.Execute.

  4. No es realmente asincrónico, pero tal vez valga la pena: Indique explícitamente mediante una RESPUESTA TEMPRANA() (o similar) EN LA PÁGINA LLAMADA al sistema, que NO SE ESPERA RESPUESTA, principalmente NO a la persona que llama. Luego haz tus cosas en curso en los scripts de la página CALLED. Al menos, el intervalo de tiempo para esperar la finalización de la llamada de sincronización podría minimizarse con un factor de facsímil de 10, 100 o más.

Cuestiones relacionadas