Странное поведение приложения WPF, обращающегося к веб-API - PullRequest
0 голосов
/ 23 мая 2018

У меня есть приложение WPF, которое я использую для извлечения данных из веб-API.

После входа в систему я сохраняю токен и на основании этого вы можете получить доступ к API или нет.

Случай 1: Войдите, получите токен, нажмите кнопку, чтобы получить данные:

private async void button1_Click(object sender, RoutedEventArgs e)
{
    getMovies();
}

Метод реализован

private void getMovies()
{
    var accessToken = token;
    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
    client.BaseAddress = new Uri("http://localhost:5001/movies/");
    client.DefaultRequestHeaders.Accept.Add(
        new MediaTypeWithQualityHeaderValue("application/json"));
    HttpResponseMessage response = client.GetAsync("get").Result;
    if (response.IsSuccessStatusCode)
    {
        MessageBox.Show(response.Content.ReadAsStringAsync().Result);
    }
    else
    {
        MessageBox.Show("Movies not Found");
    }
}

И я получу обратно 401.

Случай 2:Я вызываю API из метода Start (тот же код, что и выше): получить данные из API

public async void Start(object sender, RoutedEventArgs e)
{
    getMovies();
}

Как это возможно?И как я могу получить доступ к своему API вне метода Start?

1 Ответ

0 голосов
/ 23 мая 2018

Метод должен быть сначала подвергнут рефакторингу, чтобы следовать общепринятому синтаксису

string baseUrl = "http://localhost:5001/movies/"

private async Task getMoviesAsync() {
    var accessToken = token; //assuming token is being retrieved and set somewhere else
    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = 
        new AuthenticationHeaderValue("Bearer", accessToken);
    client.BaseAddress = new Uri(baseUrl);
    client.DefaultRequestHeaders.Accept
        .Add(new MediaTypeWithQualityHeaderValue("application/json"));
    var response = await client.GetAsync("get");
    if (response.IsSuccessStatusCode) {
        MessageBox.Show( await response.Content.ReadAsStringAsync());
    } else {
        MessageBox.Show("Movies not Found");
    }
}

и вызываться следующим образом

private async void button1_Click(object sender, RoutedEventArgs e) {
    await getMoviesAsync();
}

Создание HttpClient при любом вызове обычно не рекомендуется, но этоне по теме для текущей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...