2017-04-04 58 views
0

我正在致電Web APIMVC5服務使用HttpClient。我首先創建了一個MVCController,Get方法與HttpClient一起工作,但現在我必須將邏輯移動到服務類中,並且我在async操作中遇到錯誤,並在Get()方法中返回書籍列表。如何創建客戶端WebService來調用API?

我是否需要使用HttpWebRequest而不是服務類?

有人可以幫助我解決這個問題。

API的get()

[HttpGet]  
[Route("api/books")] 
public IHttpActionResult Get() 
{ 
    IEnumerable<BookDTO> books; 
    books = from b in db.Books 
     select new BookDTO() 
     { 
      Id = b.Id, 
      Title = b.Title, 
      AuthorName = b.Author.Name 
     }; 
    return Ok(books); 
} 

客戶bookService的

HttpClient client; 

public IEnumerable<Book> GetBooks() 
{ 
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + MyToken.myToken); 

    HttpResponseMessage responseMessage = client.GetAsync(url).Result; 

    if (responseMessage.IsSuccessStatusCode) 
    { 
     var responseData = responseMessage.Content.ReadAsStringAsync().Result; 

     var books = JsonConvert.DeserializeObject<IEnumerable<Book>>(responseData); 

     return books; 
    }    
} 

它也問我有if體後return

+0

你的方法必須返回IEnumerable的(可能爲null)在所有可能的情況,目前它只是做這裏面你的if語句 –

回答

0

如果您不想使用服務,則不必使用服務。它可能是將所有呼叫打包到特定Web服務的好方法。

至於編譯器錯誤,在你的if語句之後返回一些東西。

它可能是一個空的列表。

public IEnumerable<Book> GetBooks() 
{ 
     client.DefaultRequestHeaders.Add("Authorization", "Bearer " + MyToken.myToken); 

     HttpResponseMessage responseMessage = client.GetAsync(url).Result; 

     if (responseMessage.IsSuccessStatusCode) 
     { 
     var responseData = responseMessage.Content.ReadAsStringAsync().Result; 

     var books = JsonConvert.DeserializeObject<IEnumerable<Book>>(responseData); 

     return books; 
     }  

     return new List<Book> {};   

}

,或者如果你願意,你可以拋出一個異常。

兩者都將滿足編譯器錯誤。

+0

我不得不使用一個服務,因爲我們被告知,我需要在將來爲移動應用程序創建部分。但使用異步部件給我的項目中的問題。 – StraightUp

0

您應該處置HttpClient對象如果您不再需要它。

如果使用異步,最好的做法是異步一路UI層You should not mix blocking and async code.

public async Task<IEnumerable<Book>> GetBooks() 
{ 
    IEnumerable<Book> books = new List<Book>(); 
    using (HttpClient client = new HttpClient()) 
    { 
     client.DefaultRequestHeaders.Add("Authorization", "Bearer " + MyToken.myToken); 
     HttpResponseMessage responseMessage = await client.GetAsync(url); 
     if (responseMessage.IsSuccessStatusCode) 
     { 
      var responseData = await responseMessage.Content.ReadAsStringAsync(); 
      books = JsonConvert.DeserializeObject<IEnumerable<Book>>(responseData); 
     } 
    } 
    return books; 
} 

這裏是示例控制檯應用程序,如果你想測試它。

static void Main(string[] args) => Task.Run(() => MainAsync(args)).Wait(); 

static async Task MainAsync(string[] args) 
{ 
    var result = await GetResponseFromURI(new Uri("http://www.google.com")); 
    Console.WriteLine(result); 
    Console.ReadLine(); 
} 

static async Task<string> GetResponseFromURI(Uri u) 
{ 
    var response = ""; 
    using (var client = new HttpClient()) 
    { 
     HttpResponseMessage result = await client.GetAsync(u); 
     if (result.IsSuccessStatusCode) 
     { 
      response = await result.Content.ReadAsStringAsync(); 
     } 
    } 
    return response; 
} 
相關問題