Веб-интерфейс: HttpClient не вызывает мое действие веб-API - PullRequest
0 голосов
/ 26 мая 2018

Сначала посмотрите, как я проектирую свое действие веб-API.

[System.Web.Http.RoutePrefix("api/Appointments")]
public class AppointmentsServiceController : ApiController
{

    [System.Web.Http.HttpGet, System.Web.Http.Route("UserAppointments/{email}")]
    public IHttpActionResult UserAppointments(string email)
    {
        if (!string.IsNullOrEmpty(email))
        {
            AppointmentsService _appservice = new AppointmentsService();
            IEnumerable<Entities.Appointments> app = _appservice.GetUserWiseAppointments(email);

            if (app.Count() <= 0)
            {
                return NotFound();
            }
            else
            {
                return Ok(app);
            }
        }
        else
        {
            return BadRequest();

        }

    }
}

Теперь вот так я называю действие веб-API из моего действия asp.net mvc HttpClient.

    public async Task<ActionResult> List()
    {

        var fullAddress = ConfigurationManager.AppSettings["baseAddress"] + "api/Appointments/UserAppointments/" + Session["useremail"];

        IEnumerable<Entities.Appointments> app = null;
        try
        {
            using (var client = new HttpClient())
            {
                using (var response = client.GetAsync(fullAddress).Result)
                {
                    if (response.IsSuccessStatusCode)
                    {
                        var customerJsonString = await  response.Content.ReadAsStringAsync();
                        app = JsonConvert.DeserializeObject<IEnumerable<Entities.Appointments>>(customerJsonString);
                    }
                    else
                    {
                        Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
                        var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(response.Content.ReadAsStringAsync().Result);
                        //MessageBox.Show(dict["Message"]);
                    }
                }
            }
        }
        catch (HttpRequestException ex)
        {
            // catch any exception here
        }

        return View();
    }
 }

Я хочу захватить возврат IEnumerable и, если не возвращение данных, что я также должен захватить.пожалуйста, покажи мне правильное направление.

Где я допустил ошибку.спасибо

Ответы [ 2 ]

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

Смешивание асинхронных и блокирующих вызовов, таких как .Result

var response = client.GetAsync(fullAddress).Result

И

response.Content.ReadAsStringAsync().Result

, может привести к взаимоблокировкам, поэтому, возможно, это не влияет на ваш API.

Рефакторинг кода, чтобы он был полностью асинхронным.

Это означало бы обновление using до

var response = await client.GetAsync(fullAddress)

и чтение содержимого в выражении else до

await response.Content.ReadAsStringAsync()

Ссылка Async / Await - лучшие практики асинхронного программирования

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

Похоже, вы не ожидаете своего вызова GetAsync, поэтому в следующем if (response.IsSuccessStatusCode), вероятно, всегда возвращается false.Попробуйте вызвать свой метод так:

using (var response = (await client.GetAsync(fullAddress)).Result)
{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...