如何创建客户端WebService来调用API?

时间:2017-04-04 19:58:01

标签: c# asp.net-mvc asp.net-web-api

我正致力于使用 Web API MVC5服务中呼叫HttpClient。我首先创建了MVC ControllerGet方法正在使用HttpClient,但现在我必须将逻辑移到服务类中,我收到错误使用async操作并返回Get()方法中的书籍列表。

我是否需要使用 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);
}

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

还要求我return身后if

2 个答案:

答案 0 :(得分: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> {};        

}

或者如果你愿意,你可以抛出异常。

两者都将满足编译器错误。

答案 1 :(得分: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;
}