使用.NET核心从REST API获取数据

问题描述 投票:0回答:1

我试图使用HttpClient从REST API获取数据,但我有一个问题。使用相同的服务,但从控制台应用程序,一切正常。

从Controller一切正常,但是当来自HttpHandler的GetAsync(url)方法正在调用时,它看起来像是在后台工作但没有任何反应。

这是我的服务:

public class UserService : IUsersService
{
    private const string url = "https://jsonplaceholder.typicode.com/users";
    private IHttpHandler httpHandler;

    public UserService(IHttpHandler httpHandler)
    {
        this.httpHandler = httpHandler;
    }

    public List<User> GetAllUsers()
    {
        HttpResponseMessage response = httpHandler.Get(url);

        if (response.IsSuccessStatusCode)
        {
            return response.Content.ReadAsAsync<List<User>>().Result;
        }

        //Nice to add Logging system that we cannot connect into following URL
        return new List<User>();
    }

    public User GetUserById(int userId)
    {
        HttpResponseMessage response = httpHandler.Get(
            string.Concat(url,"?id=",userId));

        if (response.IsSuccessStatusCode)
        {
            return response.Content.ReadAsAsync<List<User>>().Result.FirstOrDefault();
        }

        //Nice to add Logging system that we cannot connect into following URL
        return null;
    }
}

这是我的Controller(使用WEB API控制器,httpClient没有从REST API获取数据)

public class UsersController : ApiController
{
    IUsersService userService;

    public UsersController(IUsersService userService)
    {
        this.userService = userService;
    }

    public List<User> GetUsers()
    {
        return userService.GetAllUsers();
    }

    public User GetUser(int userId)
    {
        return userService.GetUserById(userId);
    }
}

这是我的HttpHandler,目前正在使用HttpClient:

public class HttpHandler : IHttpHandler
{
    private HttpClient client = new HttpClient();

    public HttpResponseMessage Get(string url)
    {
        return GetAsync(url).Result;
    }

    public HttpResponseMessage Post(string url, HttpContent content)
    {
        return PostAsync(url, content).Result;
    }

    public async Task<HttpResponseMessage> GetAsync(string url)
    {
        return await client.GetAsync(url);
    }

    public async Task<HttpResponseMessage> PostAsync(string url, HttpContent content)
    {
        return await client.PostAsync(url, content);
    }
}

这是我的控制台应用程序运行良好,并显示正确的结果:

class Program
{
    static void Main(string[] args)
    {
        HttpHandler handler = new HttpHandler();
        UserService service = new UserService(handler);

        var users = service.GetAllUsers();

        Console.WriteLine(users[0].Email);
        Console.ReadKey();
    }
}

我真的不知道,这可能是个问题。

c# .net-core dotnet-httpclient
1个回答
0
投票

在挖掘网络期间,我找到了我的问题https://stackoverflow.com/a/10369275/5002910的解决方案

在GetAsync方法的HttpHandler类中,我必须返回return await client.GetAsync(url).ConfigureAwait(continueOnCapturedContext:false);

© www.soinside.com 2019 - 2024. All rights reserved.