Asp.net core ASP.Net核心WebAPI控制器-200状态代码,但无响应

Asp.net core ASP.Net核心WebAPI控制器-200状态代码,但无响应,asp.net-core,asp.net-core-webapi,Asp.net Core,Asp.net Core Webapi,我的web API中有以下控制器: [Route("api/[controller]")] public class User_TaskController : Controller { private readonly IUser_TaskRepository _taskRepository; private readonly UserManager<ApplicationUser> _userManager; private readonly WebAPI

我的web 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;
    }

}
[路由(“api/[控制器]”)]
公共类用户\u任务控制器:控制器
{
专用只读IUser_TaskRepository_TaskRepository;
私有只读用户管理器_UserManager;
私有只读WebAPIDataContext\u context;
//控制器
公共用户\u TaskController(IUser\u TaskRepository TaskRepository、UserManager UserManager、WebAPIDataContext上下文)
{
_taskRepository=taskRepository;
_userManager=userManager;
_上下文=上下文;
}
//获取方法
[HttpGet]
公共IEnumerable GetAll()
{
返回_taskRepository.GetAll();
}
[授权]
[HttpGet(“当前”)]
public IActionResult GetCurrentUserTasks()
{
//获取stakeholderId
var stakeholderId=this.GetStakeholderId();
var userTasks=\u taskRepository.GetUserTasks(stakeholderId);
返回新的ObjectResult(userTasks);
}
[HttpGet(“{id}”,Name=“GetTask”)]
公共IActionResult GetById(长id)
{
var item=\u taskRepository.Find(id);
如果(项==null)
{
返回NotFound();
}
返回新的ObjectResult(项目);
}
//创造
[授权]
[HttpPost]
公共IActionResult创建([FromBody]用户任务项)
{
如果(项==null)
{
返回请求();
}
var stakeholderId=this.GetStakeholderId();
_taskRepository.Add(项,stakeholderId);
var itemToReturn=_taskRepository.Find(item.TaskId);
如果(项==null)
{
返回NotFound();
}
返回新的ObjectResult(itemToReturn);
}
私有长GetStakeholderId()
{
字符串currentUserId=\u userManager.GetUserId(用户);
长期持股人ID=0;
var users=\u userManager.users;
foreach(用户中的var用户)
{
if(user.Email==currentUserId)
{
var idForStakeholder=user.Id;
var涉众=_context.涉众;
foreach(利益相关者中的var利益相关者)
{
if(干系人.IdentityId==idForStakeholder)
{
stakeholderId=干系人。stakeholderId;
返回stakeholderId;
}
}
}
}
返回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);
}
public class User\u TaskRepository:IUser\u TaskRepository
{
私有只读WebAPIDataContext\u context;
公共用户任务库(WebAPIDataContext上下文)
{
_上下文=上下文;
}
公共IEnumerable GetAll()
{
return _context.User_Tasks.Include(task=>task.Steps).ToList();
}
//方法,该方法返回特定用户的所有任务,即用于发出请求的登录用户
公共ICollection GetUserTasks(长stakeholderId)
{
var userTasks=\u context.User\u Tasks
.Where(task=>task.StakeholderId==StakeholderId).ToList();
返回用户任务;
}
public void Add(用户任务项,长stakeholderId)
{
item.StakeholderId=StakeholderId;
_context.User\u Tasks.Add(项);
_SaveChanges();
}
公共用户任务查找(长密钥)
{
返回_context.User_Tasks.Include(task=>task.Steps).FirstOrDefault(t=>t.TaskId==key);
}
}
公共接口IUser_任务库
{
无效添加(用户任务项,长stakeholderId);
IEnumerable GetAll();
ICollection GetUserTasks(长stakeholderId);
用户任务查找(长键);
}
问题

  • 对于create方法,记录被添加到数据库中,但我在Postman中没有得到任何响应
  • 对于获取特定用户的任务,即
    GetCurrentUserTasks()
    直到return语句前的最后一行,我看到已获取的任务,但它不返回任何内容,并且我在angular2前端仍获得状态200 Ok。我尝试删除[授权]标题,但没有效果

  • 为什么会发生这种情况?

    因为您使用的是
    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 };
    }
    
    现在,对于
    GetCurrentUserTasks()
    方法,它不能实现与
    \u userManager.GetUserId(User)相等的预期功能
    返回用户的Id,该Id是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
    }
    
    private long GetStakeholderId()
    {
    string currentUserId=_userManager.GetUserId(User);//对于Create()方法,您似乎在检查“item”变量是否为null,然后返回“itemToReturn”变量,该变量可能为null(这就是为什么会得到空结果):


    您不应该检查“itemToReturn”是否为空吗?

    \u userManager.GetUserId(用户)确实会返回我的电子邮件,电子邮件是我的用户名,实际上这就是我必须循环两次的原因。让我试试您的解决方案。我试过了,对于GetCurrentUserTasks,它仍然是相同的,我从服务器获得的状态代码是200,但没有内容:(您是如何进行身份验证的?我只是在我这端尝试了一下,它会按预期显示用户的GUID。您是使用cookie或jwt进行身份验证的吗?错误不知怎的出现在我的模型中,当我从任务中删除用户的导航属性时(如果您记得的话),它开始显示!
    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
    }
    
       //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);
    
        }