2012-04-24 16 views
9

Come chiamerei un'API Web ASP.NET direttamente dal code-behind? O dovrei chiamare la mia funzione javascript che chiama il metodo getJSON dal code-behind?Chiamare API Web ASP.NET da code-behind

Io di solito hanno qualcosa di simile:

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

Qualsiasi puntatori apprezzato. TIA.

* Sto usando WebForms.

+0

Che cosa si intende per "code-behind"? – SLaks

+0

@SLaks Dire che ho un asp: pulsante. Al suo evento click (lato server/code-behind), vorrei fare un paio di cose e poi chiamare la mia azione API Web (createfile). Spero di essere chiaro. – Rivka

+0

Pls controlla il mio esempio di codice. Forse un po 'ingenuo e semplice, ma è solo per te 2 avere l'idea. –

risposta

13

Se è necessario chiamare il servizio Web stesso, provare a utilizzare HttpClientas described by Henrik Neilsen.

Updated HTTPClient Samples

un esempio di base:

// 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

Grazie! Esattamente quello che stavo cercando di fare. Ci scusiamo per l'e/o altro per forse non spiegando bene. Apprezzo tutto il tuo aiuto. – Rivka

+0

Quando provo a convertirlo in vb.net requestTask.Result non compilerò dicendo "risultato non è un membro di system.threading.tasks.task" ma in C# è stato trovato in httpresponsemessage. questa proprietà non è in vb.net?ho usato il sito di conversione di telerek per fare la conversione – Matma

3

Consigliato in molti libri di architettura software è che non si deve mettere alcuna logica di business nel proprio codice di controller (API). Supponendo che la si implementa nel modo giusto, ad esempio che il codice del controller accede attualmente alla logica di business attraverso una classe di servizio o facciata, il mio suggerimento è che si riutilizzi la stessa classe/facciata di servizio per quello scopo, invece di passare attraverso la porta principale. '(così facendo la chiamata JSON dal codice dietro)

per esempio di base e naieve:

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; 
    } 
} 

classe AppService incapsula la logica di business (e fa vivere su un altro livello) e rende più facile per voi accedi alla tua logica:

public class AppService: IAppService { 

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

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

    } 

    ... 
} 
+2

Direi che l'utilizzo di "Correggi" non è corretto. Ci sono certamente dei paradigmi di design che sostengono questo, così come ce ne sono altri che dicono che l'intero percorso di controller/facciata/etc è un'enorme quantità di codice sprecato/ore di lavoro. Non ho intenzione di svendere; tuttavia, sto solo dicendo che ci sono molte definizioni di 'Correggi' per la progettazione di software la maggior parte delle quali sono dipendenti dalla situazione. – NotMe

+1

Vero, il mio inglese non è perfetto, "Corretto" non era la parola corretta. –

+1

Grazie per aver fornito un esempio. Penso di vedere quello che stai dicendo sulle classi, anche se la mia domanda è sulla chiamata al metodo effettivo di CreateFile() in WebAPI. Come dovrei chiamarlo da un evento lato server in un'applicazione Web Forms? Qual è l'approccio migliore? – Rivka

6

Si dovrebbe rifattorizzare la logica in una classe di backend separata e chiamarla direttamente dal proprio code-behind e dall'azione dell'API Web.

+0

un codice di esempio potrebbe aiutare ... Sono bloccato su "Chiamalo direttamente dal tuo codice" parte- Di solito Lo faccio con la mia funzione JS. – Rivka

+0

@Becky: chiama la classe separata direttamente dal code-behind. – SLaks