Основной контроллер WebAPI ASP.Net - код состояния 200, но нет ответа

У меня есть следующий контроллер в моем веб-API:

[Route("api/[controller]")]
public class User_TaskController : Controller
{
    private readonly IUser_TaskRepository _taskRepository;
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly WebAPIDataContext _context;

    //Controller
    public User_TaskController(IUser_TaskRepository taskRepository, UserManager<ApplicationUser> userManager, WebAPIDataContext context)
    {
        _taskRepository = taskRepository;
        _userManager = userManager;
        _context = context;
    }

    //Get methods
    [HttpGet]
    public IEnumerable<User_Task> GetAll()
    {

        return _taskRepository.GetAll();
    }


    [Authorize]
    [HttpGet("current")]
    public IActionResult GetCurrentUserTasks()
    {

        // Obtain stakeholderId
        var stakeholderId = this.GetStakeholderId();
        var userTasks = _taskRepository.GetUserTasks(stakeholderId);

        return new ObjectResult(userTasks);
    }

    [HttpGet("{id}", Name = "GetTask")]
    public IActionResult GetById(long id)
    {
        var item = _taskRepository.Find(id);
        if (item == null)
        {
            return NotFound();
        }
        return new ObjectResult(item);
    }

    //Create
    [Authorize]
    [HttpPost]
    public IActionResult Create([FromBody] User_Task item)
    {

        if (item == null)
        {
            return BadRequest();
        }

        var stakeholderId = this.GetStakeholderId();


        _taskRepository.Add(item, stakeholderId);

        var itemToReturn = _taskRepository.Find(item.TaskId);
        if (item == null)
        {
            return NotFound();
        }
        return new ObjectResult(itemToReturn);

    }

    private long GetStakeholderId()
    {
        string currentUserId = _userManager.GetUserId(User);
        long stakeholderId = 0;

        var users = _userManager.Users;
        foreach (var user in users)
        {
            if (user.Email == currentUserId)
            {
                var idForStakeholder = user.Id;
                var stakeholders = _context.Stakeholders;
                foreach (var stakeholder in stakeholders)
                {
                    if (stakeholder.IdentityId == idForStakeholder)
                    {
                        stakeholderId = stakeholder.StakeholderId;
                        return stakeholderId;
                    }
                }

            }
        }
        return stakeholderId;
    }

}

И соответствующий репозиторий:

public class User_TaskRepository : IUser_TaskRepository
{
    private readonly WebAPIDataContext _context;

    public User_TaskRepository(WebAPIDataContext context)
    {
        _context = context;

    }

    public IEnumerable<User_Task> GetAll()
    {
        return _context.User_Tasks.Include(task => task.Steps).ToList();
    }

    // Method that returns all the tasks of a specific user i.e. logged in used making the request
    public ICollection<User_Task> GetUserTasks(long stakeholderId)
    {

        var userTasks = _context.User_Tasks
            .Where(task => task.StakeholderId == stakeholderId).ToList();

        return userTasks;
    }

    public void Add(User_Task item , long stakeholderId)
    {
        item.StakeholderId = stakeholderId;   

       _context.User_Tasks.Add(item);
       _context.SaveChanges();
    }

    public User_Task Find(long key)
    {
        return _context.User_Tasks.Include(task => task.Steps).FirstOrDefault(t => t.TaskId == key);
    }


}

public interface IUser_TaskRepository
{
    void Add(User_Task item, long stakeholderId);
    IEnumerable<User_Task> GetAll();
    ICollection<User_Task> GetUserTasks(long stakeholderId);
    User_Task Find(long key);
}

Проблемы:

  1. Для метода создания запись добавляется в базу данных, но я не получаю ответа в Postman.
  2. Для получения задач для конкретных пользователей, т. е. GetCurrentUserTasks() до последней строки перед оператором возврата, я вижу извлеченные задачи, однако ничего не возвращает, и я все еще получаю статус 200 Ok на моем интерфейсе angular2. Я попытался удалить заголовок [Authorize], но безрезультатно.

Почему это происходит?


person Thinker    schedule 30.05.2017    source источник


Ответы (2)


Для вашего метода Create() кажется, что вы проверяете, является ли переменная "item" нулевой, а затем возвращаете переменную "itemToReturn", которая, вероятно, имеет значение null (поэтому вы получаете пустой результат):

   //Create
    [Authorize]
    [HttpPost]
    public IActionResult Create([FromBody] User_Task item)
    {

        if (item == null)
        {
            return BadRequest();
        }

        var stakeholderId = this.GetStakeholderId();


        _taskRepository.Add(item, stakeholderId);

        var itemToReturn = _taskRepository.Find(item.TaskId);
        if (item == null) // checking item instead of itemToReturn
        {
            return NotFound();
        }
        return new ObjectResult(itemToReturn);

    }

Разве вы не должны проверять, является ли «itemToReturn» нулевым?

person Omar Beyhum    schedule 31.05.2017
comment
Ошибка была как-то в моих моделях, когда я удалил свойство навигации пользователя из Task (если вы помните), оно начало отображаться! - person Thinker; 02.06.2017

Поскольку вы используете ObjectResult(){}, я считаю, что встроенные изменения - это то, что вам нужно.

[Authorize]
[HttpGet("current")]
public IActionResult GetCurrentUserTasks()
{
    var status = HttpStatus.Ok; //<< add

    // Obtain stakeholderId
    var stakeholderId = this.GetStakeholderId();
    var userTasks = _taskRepository.GetUserTasks(stakeholderId);

    if(userTasks == null)
       status = HttpStatusCode.NoContent;

    return new ObjectResult(userTasks){StatusCode = (int)status };
}

Ниже вашего метода с включенными изменениями

//Create
[Authorize]
[HttpPost]
public IActionResult Create([FromBody] User_Task item)
{
   var status = HttpStatusCode.Ok;
    if (item == null)
    {
        status = HttpStatusCode.BadRequest;
        return BadRequest();
    }

    var stakeholderId = this.GetStakeholderId();


    _taskRepository.Add(item, stakeholderId);

    var itemToReturn = _taskRepository.Find(item.TaskId);
    if (itemToReturn == null)
    {
        status = HttpStatusCode.NoContent;
        return NotFound();
    }
    return new ObjectResult(itemToReturn){StatusCode = (int)status};

}

Теперь метод for GetCurrentUserTasks() не делает того, что вы ожидаете. Приравнивание _userManager.GetUserId(User); возвращает идентификатор USER, который является GUID, а не электронной почтой, поэтому ваша логика в цикле for (почему вы перебираете пользователей, это необычный шаг, на самом деле бесполезный) убивает структура следующего цикла. Все это основано на моем предположении, что вы используете неизменную настройку удостоверения для ASp.net Core.

private long GetStakeholderId()
{
    string currentUserId = _userManager.GetUserId(User);  // << GUID
    long stakeholderId = 0;

    var users = _userManager.Users;       //<< pointless
    foreach (var user in users)           //   ^^^   
    {
        if (user.Email == currentUserId)  << // will never be TRUE
        {
            var idForStakeholder = user.Id;
            var stakeholders = _context.Stakeholders;
            foreach (var stakeholder in stakeholders)
            {
                if (stakeholder.IdentityId == idForStakeholder)
                {
                    stakeholderId = stakeholder.StakeholderId;
                    return stakeholderId;
                }
            }

        }
    }
    return stakeholderId;   // WILL ALWAYS be 0
}

Я почти уверен, что на данный момент из опубликованного кода вы получите OK 200 от GetCurrentUserTasks(), потому что он запускается, но никогда не выполняет задачи для пользователя, поскольку пользователь никогда не был правильно найден в базе вашего кода.

person mvermef    schedule 30.05.2017
comment
_userManager.GetUserId(User) действительно возвращает мне электронную почту, электронная почта - это мое имя пользователя, на самом деле, поэтому мне пришлось пройти дважды. Позвольте мне попробовать ваше решение. - person Thinker; 31.05.2017
comment
Я пробовал, и для GetCurrentUserTasks все было по-прежнему, я получаю код состояния 200, но с сервера нет контента :( - person Thinker; 31.05.2017
comment
как вы проходите аутентификацию? Я только что попробовал это со своей стороны, и он показывает GUID для пользователя, как и ожидалось. Вы аутентифицируетесь с помощью cookie или jwt? - person mvermef; 31.05.2017