2012-10-17 10 views
5

Ho un'applicazione scritta in Servizio Windows e questa app deve effettuare una chiamata a una WebAPI scritta in Asp.Net MVC 4 WebAPi. questo metodo in WebAPI restituisce un DTO con tipo primitivo, qualcosa di simile:Come chiamare una WebAPI dal servizio di Windows

class ImportResultDTO { 
    public bool Success { get; set; } 
    public string[] Messages { get; set; } 
} 

e nel mio WebAPI

public ImportResultDTO Get(int clientId) { 
    // process.. and create the dto result. 
    return dto; 
} 

La mia domanda è, come posso chiamare il WebAPI dal servizio di Windows? Ho il mio URL e il valore del parametro, ma non so come chiamare e come deserializzare il risultato xml al DTO.

Grazie

+0

http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client – blins

+1

In Oltre a fare riferimento a HttpClient come raccomandato dalle persone, renderà la vita più semplice se si posiziona ImportResultDTO nel suo possedere una libreria di classi (la libreria del modello di servizio) e quindi fare riferimento a tale libreria sia dal servizio API Web sia dal servizio Windows. È quindi possibile consentire a HttpClient di gestire la materializzazione dei dati di chiamata del servizio nella classe DTO fortemente tipizzata. – Oppositional

risposta

13

Si potrebbe utilizzare System.Net.Http.HttpClient. Ovviamente dovrai modificare l'indirizzo di base falso e richiedere l'URI nell'esempio seguente, ma questo mostra anche un modo basilare per controllare anche lo stato della risposta.

// Create an HttpClient instance 
HttpClient client = new HttpClient(); 
client.BaseAddress = new Uri("http://localhost:8888/"); 

// Usage 
HttpResponseMessage response = client.GetAsync("api/importresults/1").Result; 
if (response.IsSuccessStatusCode) 
{ 
    var dto = response.Content.ReadAsAsync<ImportResultDTO>().Result; 
} 
else 
{ 
    Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase); 
} 
+0

Grazie mille, c'è un modo per verificare se l'URL della mia WebAPI è disponibile prima chiamo 'client.GetAsync (...). Risultato'? Intendo perché la connessione Internet o il mio webapi potrebbero essere instabili e ho bisogno di controllarlo prima di fare un evento log corretto per questo. Grazie. –

+0

Non potresti semplicemente racchiudere la chiamata a GetAysnc in un blocco try/catch e gestire la possibile eccezione? Provalo e segui la traccia dello stack, le eccezioni interne assomigliano a ciò che stai cercando (ad esempio "Nessuna connessione potrebbe essere fatta perché ...") – blins

2

È possibile installare questo pacchetto NuGet Microsoft ASP.NET Web API Client Libraries al progetto di servizio Windows.

Qui è un codice semplice frammento che illustra come utilizzare HttpClient:

 var client = new HttpClient(); 
     var response = client.GetAsync(uriOfYourService).Result; 
     var content = response.Content.ReadAsAsync<ImportResultDTO>().Result; 

(sto chiamando .Result() qui per la semplicità ...)

Per ulteriori campione di HttpClient, per favore guarda questo: List of ASP.NET Web API and HttpClient Samples.

+0

Grazie, Maggie. Voto il tuo awser. C'è un modo per verificare se l'URL della mia WebAPI è disponibile prima chiamo client.GetAsync (...). Risultato? Intendo perché la connessione Internet o il mio webapi potrebbero essere instabili e ho bisogno di controllarlo prima di fare un evento log corretto per questo. Grazie. –

Problemi correlati