Получить данные из REST API с помощью ядра .NET - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь получить данные из REST API с помощью HttpClient, но у меня есть проблема.Используя тот же сервис, но из Консольного приложения, все работает нормально.

Из контроллера все работает нормально, но когда вызывается метод GetAsync (url) из HttpHandler, похоже, что что-то работает в фоновом режиме, но ничего не происходит ..

Это мой сервис:

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

Это мой контроллер (используя контроллер 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();
    }
}

Я не знаю, что моглобыть проблемой.

1 Ответ

0 голосов
/ 07 октября 2018

Во время копания сети я нашел решение моей проблемы https://stackoverflow.com/a/10369275/5002910

В классе HttpHandler в методе GetAsync я должен вернуть return await client.GetAsync(url).ConfigureAwait(continueOnCapturedContext:false);

...