我正致力于使用 Web API
从MVC5
服务中呼叫HttpClient
。我首先创建了MVC
Controller
,Get
方法正在使用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
答案 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;
}