2012-10-17 56 views
5

我有一個在Windows服務中編寫的應用程序,此應用程序需要調用以Asp.Net MVC 4 WebAPi編寫的WebAPI。這種方法的WebAPI返回與原始類型,像一個DTO:如何從Windows服務調用WebAPI

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

,並在我的WebAPI

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

我的問題是,我怎麼能叫從Windows服務中的WebAPI?我有我的URL和參數值,但我不知道如何調用以及如何將xml結果反序列化到DTO。

謝謝

+0

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

+1

In除了像人們推薦的那樣引用HttpClient之外,如果將ImportResultDTO放入其中自己的類庫(您的服務模型庫),然後從Web API服務和Windows服務中引用該庫。然後,您可以讓HttpClient將服務調用數據的實現處理爲強類型的DTO類。 – Oppositional

回答

13

你可以使用System.Net.Http.HttpClient。您將顯然需要在下面的示例中編輯假基地址和請求URI,但這也顯示了檢查響應狀態的基本方法。

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

謝謝blins,在我調用'client.GetAsync(...)。Result'之前,有沒有什麼方法可以檢查我的WebAPI的URL是否可用?我的意思是因爲互聯網連接或我的webapi可能會不穩定,我需要檢查它之前做一個正確的eventLog它。謝謝。 –

+0

你能不能把調用GetAysnc包裝在try/catch塊中,並處理可能的Exception?嘗試一下,並按照堆棧跟蹤,內部異常看起來像你之後(例如「無法建立連接,因爲...」) – blins

2

您可以將此NuGet程序包Microsoft ASP.NET Web API Client Libraries安裝到您的Windows服務項目中。

下面是一個簡單的代碼片段演示如何使用的HttpClient:

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

(我打電話。結果()這裏簡單起見...)

對於更多樣本HttpClient,請查看:List of ASP.NET Web API and HttpClient Samples.

+0

謝謝瑪姬。我投票你的喚醒。有什麼方法可以在我調用client.GetAsync(...)之前檢查WebAPI的URL是否可用。結果?我的意思是因爲互聯網連接或我的webapi可能會不穩定,我需要檢查它之前做一個正確的eventLog它。謝謝。 –