Исправить некорректное поведение метода веб-API. - PullRequest
0 голосов
/ 05 мая 2019

У меня есть проблема в моем методе API. У меня есть метод GetDrones, который не работает должным образом (здесь нет адекватной логики. Я просто сделал его настолько коротким, насколько смог, чтобы упростить его) [путь 0]:

[Produces("application/json")]
[Route("api/[controller]")]
public class OwnersController : Controller
{
    private readonly ApplicationDbContext _context;
    private readonly ClaimsPrincipal _caller;

    public OwnersController(ApplicationDbContext context, IHttpContextAccessor httpContextAccessor)
    {
        _context = context;
        _caller = httpContextAccessor.HttpContext.User;

    }
    [HttpGet("GetOwnersDrones")]
    public List<Drone> GetDrones()
    {
        var userId = _caller.Claims.Single(c => c.Type == "id");
        var customer = _context.Customers.Single(c => c.Identity.Id == userId.Value);
        var owner = _context.Owners.Single(o => o.CustomerId == customer.Id);


        return _context.Drones.ToList();
    }
}

enter image description here enter image description here
Но если я поменяю метод таким образом [путь 1]:

[HttpGet("GetOwnersDrones")]
public List<Drone> GetDrones()
{
    var userId = _caller.Claims.Single(c => c.Type == "id");
    var customer = _context.Customers.Single(c => c.Identity.Id == userId.Value);
    var owner = _context.Owners.Single(o => o.CustomerId == customer.Id);


    return null;
}

enter image description here Или так [путь 2]:

[HttpGet("GetOwnersDrones")]
public List<Drone> GetDrones()
{
    var userId = _caller.Claims.Single(c => c.Type == "id");
    var customer = _context.Customers.Single(c => c.Identity.Id == userId.Value);
    //var owner = _context.Owners.Single(o => o.CustomerId == customer.Id);


    return _context.Drones.ToList();
}

enter image description here Оба работают (без ошибок появляется). Таким образом, я заключаю, что

_context.Drones.ToList();

и

_context.Owners.Single(o => o.CustomerId == customer.Id);

не работает, когда в одном методе? Как я могу решить эту проблему и заставить изначальный метод работать?

UPDATE

[HttpGet("GetOwnersDrones")]
public Owner GetOwnersDrones()
{
    var userId = _caller.Claims.Single(c => c.Type == "id");
    var customer = _context.Customers.Single(c => c.Identity.Id == userId.Value);
    var owner = _context.Owners.SingleOrDefault(o => o.CustomerId == customer.Id);

    return owner;
}

enter image description here

DEBUG
Я отлаживал через метод. Как видите, список drones и owner не пуст, но я получаю сообщение «Не удалось получить ответ» enter image description here

1 Ответ

0 голосов
/ 05 мая 2019

Скорее всего, эта строка:

    var owner = _context.Owners.Single(o => o.CustomerId == customer.Id);

не нашел совпадений для запроса и выдал исключение. Я бы порекомендовал прочитать о Single и SingleOrDefault методах LINQ, чтобы лучше понять их поведение.

Не отлаживая свой код (см. Атака на процесс для отладки служб Web API), вы упускаете всю необходимую информацию, необходимую для решения ваших проблем.

Вы должны обратить внимание на исключения, выдаваемые в контроллере.

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