2012-10-17 13 views
5

Mam aplikację napisaną w usłudze systemu Windows i ta aplikacja musi nawiązać połączenie z WebAPI napisanym w sieci Web ASP.Net MVC 4. Metoda ta w WebAPI zwrócić dto z prymitywnego rodzaju, coś jak:Jak wywołać WebAPI z usługi Windows

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

i moim WebAPI

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

Moje pytanie brzmi, jak mogę zadzwonić do WebAPI z usługi Windows? Mam swój adres URL i wartość parametru, ale nie wiem jak zadzwonić i jak deserializować wynik xml do DTO.

Dziękuję

+0

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

+1

In Oprócz odwoływania się do HttpClient, jak zalecają ludzie, ułatwi to życie, jeśli umieścisz ImportResultDTO w jego własną bibliotekę klas (twoja biblioteka modelu usług), a następnie odwołaj tę bibliotekę zarówno z usługi Web API, jak iz usługi Windows. Następnie możesz pozwolić HttpClientowi obsłużyć materializację danych wywołania serwisowego do mocno napisanej klasy DTO. – Oppositional

Odpowiedz

13

Można użyć System.Net.Http.HttpClient. Oczywiście będziesz musiał edytować fałszywy adres bazowy i zażądać identyfikatora URI w poniższym przykładzie, ale to również pokazuje podstawowy sposób sprawdzenia statusu odpowiedzi.

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

Dziękuję Bliny, czy istnieje sposób sprawdzenia, czy adres URL mojego WebAPI jest dostępny, zanim zadzwonię do 'client.GetAsync (...). Wynik'? Mam na myśli to, ponieważ połączenie internetowe lub moja webapi może być niestabilna i muszę to sprawdzić przed zrobieniem poprawnej zmiennej eventLog. Dziękuję Ci. –

+0

Nie możesz po prostu owijać połączenia do GetAysnc w bloku try/catch i obsługiwać możliwego wyjątku? Wypróbuj go i wykonaj śledzenie stosu, wewnętrzne wyjątki wyglądają, jakbyś był po (np. "Nie można nawiązać połączenia, ponieważ ...") – blins

2

Można zainstalować ten pakiet Nuget Microsoft ASP.NET Web API Client Libraries do projektu usługi Windows.

Oto prosty fragment kodu wykazywania jak używać HttpClient:

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

(Dzwonię .Result() tutaj dla uproszczenia ...)

Dalsze próby HttpClient, sprawdź to: List of ASP.NET Web API and HttpClient Samples.

+0

Dziękuję Maggie. Głosuję do twojego awservera. Czy istnieje sposób sprawdzenia, czy adres URL mojego WebAPI jest dostępny, zanim zadzwonię do klienta.GetAsync (...). Wynik? Mam na myśli to, ponieważ połączenie internetowe lub moja webapi może być niestabilna i muszę to sprawdzić przed zrobieniem poprawnej zmiennej eventLog. Dziękuję Ci. –

Powiązane problemy