2012-04-24 31 views
9

¿Cómo puedo llamar a una API web de ASP.NET directamente desde código subyacente? ¿O debería llamar a mi función javascript que llama al método getJSON desde código subyacente?Llamar ASP.NET Web API desde código subyacente

por lo general tienen algo como:

function createFile() { 
     $.getJSON("api/file/createfile", 
     function (data) { 
      $("#Result").append('Success!'); 
     }); 
    } 

Cualquier punteros apreciados. TIA.

* Estoy usando WebForms.

+0

¿Qué quiere decir con "código subyacente"? – SLaks

+0

@SLaks Digo que tengo un botón asp: En su evento click (lado del servidor/código subyacente), me gustaría hacer un par de cosas y luego llamar a mi acción Web API (createfile). Espero que esté claro. – Rivka

+0

Por favor revise mi ejemplo de código. Tal vez un poco ingenuo y básico, pero es solo para ti que entiendas la idea. –

Respuesta

13

Si debe llamar al servicio web en sí, puede intentar usar HttpClientas described by Henrik Neilsen.

Updated HTTPClient Samples

Un ejemplo básico:

// Create an HttpClient instance 
HttpClient client = new HttpClient(); 

// Send a request asynchronously continue when complete 
client.GetAsync(_address).ContinueWith( 
    (requestTask) => 
    { 
     // Get HTTP response from completed task. 
     HttpResponseMessage response = requestTask.Result; 

     // Check that response was successful or throw exception 
     response.EnsureSuccessStatusCode(); 

     // Read response asynchronously as JsonValue 
     response.Content.ReadAsAsync<JsonArray>().ContinueWith( 
        (readTask) => 
        { 
         var result = readTask.Result 
         //Do something with the result     
        }); 
    }); 
+0

¡Gracias! Exactamente lo que estaba tratando de hacer. Perdón por e/o else por posiblemente no explicar bien. Aprecia toda tu ayuda. – Rivka

+0

Cuando intento convertir esto a vb.net requestTask.Result no se compila diciendo "el resultado no es miembro de system.threading.tasks.task" pero en C# se encuentra en httpresponsemessage. ¿esta propiedad no está en vb.net?utilicé el sitio de conversión telerek para hacer la conversión – Matma

3

Se recomienda en muchos libros de arquitectura de software que no debe poner ninguna lógica comercial en su código de controlador (API). Suponiendo que lo implemente de la manera correcta, por ejemplo, que su código de Controlador actualmente accede a la lógica comercial a través de una clase o fachada de Servicio, mi sugerencia es que reutilice la misma clase/fachada de Servicio para ese propósito, en lugar de atravesar la 'puerta principal' '(así haciendo la llamada JSON del código detrás)

básico y naieve ejemplo:

public class MyController1: ApiController { 

    public string CreateFile() { 
     var appService = new AppService(); 
     var result = appService.CreateFile(); 
     return result; 
    } 

} 

public class MyController2: ApiController { 

    public string CreateFile() { 
     var appService = new AppService(); 
     var result = appService.CreateFile(); 
     return result; 
    } 
} 

clase AppService encapsula la lógica de negocio (y vive en otra capa) y hace que sea más fácil para que usted pueda acceda a su lógica:

public class AppService: IAppService { 

    public string MyBusinessLogic1Method() { 
     .... 
     return result; 
    } 
    public string CreateFile() { 

      using (var writer = new StreamWriter..blah die blah { 
      ..... 
      return 'whatever result'; 
      } 

    } 

    ... 
} 
+2

Yo diría que su uso de 'Corregir' es incorrecto. Ciertamente hay paradigmas de diseño que defienden esto, al igual que hay otros que dicen que todo el camino del controlador/fachada/etc. es una enorme cantidad de horas desperdiciadas de código/hombre. No voy a downvote; sin embargo, solo digo que hay muchas definiciones de 'Correcto' para el diseño de software, la mayoría de las cuales dependen de la situación. – NotMe

+1

Es cierto, mi inglés no es perfecto, 'Correcto' no era la palabra correcta. –

+1

Gracias por dar un ejemplo. Creo que veo lo que dices sobre las clases, aunque mi pregunta es acerca de la llamada al método real de CreateFile() en la WebAPI. ¿Cómo debería llamar eso desde un evento del lado del servidor en una aplicación de formularios web? ¿Cuál es el mejor enfoque? – Rivka

6

Debería refactorizar la lógica en una clase backend separada y llamarla directamente desde su código subyacente y desde la acción de la API web.

+0

algún código de muestra ayudaría ... Estoy atascado en la parte "llamar directamente desde el código subyacente" - Por lo general Lo hago con mi función JS. – Rivka

+0

@Becky: llame a la clase por separado directamente desde su código subyacente. – SLaks

Cuestiones relacionadas