none
Ejecutar una url de API desde mi web ASP NET sin esperar respuesta RRS feed

  • Pregunta

  • Hola, tengo una complicación espero puedan ayudarme.

    Estoy trabajando con Visual Studio 2005, en ASP.NET con VB net. Framework 2.0

    Me encuentro con la necesidad de agregar un boton a una pagina, y desde el code behind llamar a una URL externa que lanza un proceso de una API externa, por ej:   http://192.168.1.1/api/ejecutarproceso

    Este proceso de la api tarda horas, pero a mi no me interesa, solo necesito ejecutarlo sin esperar respuesta.

    Es decir, necesito apretar el boton desde mi pagina ASP NET, lanzar la url de la API y que no se me congele mi web esperando respuesta.

    Es posible hacer esto? No tengo ni idea de como empezar o como googlear para hacerlo.

    Espero puedan ayudarme

    Gracias!

    martes, 14 de julio de 2020 23:02

Respuestas

Todas las respuestas

  • hola

    >>necesito apretar el boton desde mi pagina ASP NET, lanzar la url de la API y que no se me congele mi web esperando respuesta.

    Podrias realizar la opracion en un thread, asi este queda ejecutando sin bloquear el request

    VB.Net Create Thread

    en tu caso harias el Start() para lanzarlo pero no usarias el Join() ya que no quieres esperar la respuesta

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 15 de julio de 2020 2:22
  • Leandro, gracias por la respuesta.

    Pero si yo clickeo el boton, y se lanza la url de la API, e inmediatamente cierro mi web, el proceso de la API que se lanzo continua su ejecución o depende de que tenga abierto el thread que lo invoca?

    miércoles, 15 de julio de 2020 2:59
  • hola

    >>se lanza la url de la API, e inmediatamente cierro mi web, el proceso de la API que se lanzo continua su ejecución

    si el request llego al servidor entonces se va a ajecutar aunque despues nadie reciba la respuesta

    el thread lo mencione para no quedar esperando la respuesta

    Pero tambien se podria realizar una llamada asincrona usando ajax desde el codigo cliente, se podria usar el $.ajax de jquery

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 15 de julio de 2020 4:32
  • ¿Te han funcionado las respuestas? Si nos puedes actualizar tu estado, sería genial!

    Saludos

    miércoles, 15 de julio de 2020 16:06
    Moderador
  • Leandro muchas gracias!

    pude hacer el thread y lanzar el proceso, y no me traba la web!

    Te consulto lo ultimo a ver si me podes salvar. Hago el thread de esta manera:

    Protected Sub btnEjecutar(ByVal sender as system.object, ByVal e as System.EventArgs)
       Dim th as new Thread(AddressOf Ejecutar)
    End Sub
    
    Private Sub Ejecutar()
       Process.Start("http://192.168.1.1/api/ejecutar")
    End Sub

    Funciona, pero al hacer el llamado, la url hacia la api me abre una nueva pestaña en el navegador, a pesar de que la api no tiene vista, o sea el llamado al proceso de la api devuelve como resultado un string, pero no me interesa verlo, quiero que la ejecucion sea invisible al usuario. Hay posibilidad de evitar esto?

    o sea que al apretar el boton se lance el process.start pero que no me abra la pestaña en el navegador.



    • Editado MDev2020 jueves, 16 de julio de 2020 5:11
    jueves, 16 de julio de 2020 5:10
  • Es el Process.Start el que te abre la pestaña. Es más, te la intenta abrir en el servidor web, no en el PC desde el que estás navegando a tu web. Seguramente lo estás probando localmente en tu PC de desarrollo y por eso el servidor te coincide con el cliente, pero en cuanto publiques tu web fallará muchísimo porque IIS no tiene acceso a la pantalla y el process.start no puede abrir el navegador y en consecuencia no llamará a tu API. Así que ara una aplicación web, olvídate del Process.Start. No puedes usarlo para esto.

    Usa en su lugar alguna de las clases que permiten hacer llamadas web, como por ejemplo el WebClient:

    Imports System.Net
    '...
    
    Protected Sub btnEjecutar(ByVal sender as system.object, ByVal e as System.EventArgs)
       Dim th as new Thread(AddressOf Ejecutar)
       th.Start()
    End Sub
    
    Private Sub Ejecutar()
       Dim wc as New WebClient()
       wc.DownloadString("http://192.168.1.1/api/ejecutar")
    End Sub

    También existe un método DownloadStringAsync que te permite hacer lo mismo sin usar un Thread.

    jueves, 16 de julio de 2020 7:07
  • Alberto! peron por la demora

    te hago la ultima consulta, es posible usar un httpWebRequest en lugar del webclient?

    Estoy probando esto:

    Dim request as HttpWebRequest
    request = CType(WebRequest.Create("http://192.168.1.1/api/ejecutar"), HttpWebRequest)
    
    request.GetResponse()
    Esto funciona en mi pc de desarrollo, me ejecuta la api perfecto y no me abre ninguna pestaña, pero me da la duda de cuando lo suba al servidor. No tengo manera de probarlo hasta dentro de un mes que me habiliten el servidor. Cualquier info que me des te lo agradezco!









    • Editado MDev2020 martes, 21 de julio de 2020 22:05
    martes, 21 de julio de 2020 18:56