Asp.net core ASP.Net核心WebAPI控制器-200状态代码,但无响应
我的web API中有以下控制器: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
[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);
用户任务查找(长键);
}
问题:
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);
}