Такой хост не известен. (Вызывая weatherAPI из контроллера webapi с помощью HttpClient) - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь вызвать openWeatherApi из asp.net WebAPI. Когда я получаю название города из внешнего интерфейса, я использую его для поиска города / аэропорта в базе данных. Затем я использую широту и длину аэропорта, чтобы вызвать API openweather. Я хочу использовать ответ для дальнейших расчетов и прогнозов.

Мой код:

HttpClient client = new HttpClient();

try
                {
                    client.BaseAddress = new Uri("http://api.openweather.org");
                     var response = await client.GetAsync($"/data/2.5/weather?lat={airport.AirportLatitude}&lon={airport.AirportLongitude}&appid={apiKey}");
                  //  var response = await // client.GetAsync($"/data/2.5/weather?q=London,uk&appid={apiKey}");
                    response.EnsureSuccessStatusCode();

                    var stringResult = await response.Content.ReadAsStringAsync();
                    var rawWeather = JsonConvert.DeserializeObject<OpenWeatherResponse>(stringResult);
                    System.Console.WriteLine("$$$$$$$$$$$After API call made$$$$$$$$$$$$$$$");
                    System.Console.WriteLine(response);
                    return Ok(new {
                        Temp = rawWeather.Main.Temp,
                        Summary = string.Join(",", rawWeather.Weather.Select(x=>x.Main)),
                        City = rawWeather.Name
                    });
                    // return Ok(response);
                }

                catch(HttpRequestException httpRequestException)
                {   
                    System.Console.WriteLine(httpRequestException.Message); 
                    return BadRequest($"Error getting weather : {httpRequestException.Message}");
                }

Когда я запускаю это приложение, иногда я получаю 400BadRequest, а иногда я получаю 500: Внутренняя ошибка сервера

1) Такой хост не известен. 2) System.InvalidOperationException: этот экземпляр уже запустил один или несколько запросов. Свойства могут быть изменены только перед отправкой первого запроса.

Startup.cs

services.AddTransient<HttpClient>(); 
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

Когда я пытаюсь вставить полный URL-адрес openweather в свой браузер, он возвращает json, но выдает ошибку при попытке запуска из ASP.NET CORE Web Api Controller.

Любая помощь будет принята с благодарностью.

Заранее спасибо

1 Ответ

0 голосов
/ 23 января 2019

Вы должны использовать оператор using

using (var client = new HttpClient())
{
          try
            {
                client.BaseAddress = new Uri("http://api.openweather.org");
                 var response = await client.GetAsync($"/data/2.5/weather?lat={airport.AirportLatitude}&lon={airport.AirportLongitude}&appid={apiKey}");
              //  var response = await // client.GetAsync($"/data/2.5/weather?q=London,uk&appid={apiKey}");
                response.EnsureSuccessStatusCode();

                var stringResult = await response.Content.ReadAsStringAsync();
                var rawWeather = JsonConvert.DeserializeObject<OpenWeatherResponse>(stringResult);
                System.Console.WriteLine("$$$$$$$$$$$After API call made$$$$$$$$$$$$$$$");
                System.Console.WriteLine(response);
                return Ok(new {
                    Temp = rawWeather.Main.Temp,
                    Summary = string.Join(",", rawWeather.Weather.Select(x=>x.Main)),
                    City = rawWeather.Name
                });
                // return Ok(response);
            }

            catch(HttpRequestException httpRequestException)
            {   
                System.Console.WriteLine(httpRequestException.Message); 
                return BadRequest($"Error getting weather : {httpRequestException.Message}");
            }
}
...