[英]Getting current logged on user in web api controller
我試圖在Web API控制器中檢索當前登錄的用戶詳細信息,以創建用戶個人資料頁面。
我已經創建了方法,但是用戶在代碼中始終返回null,如下所示。 這在我的MVC控制器中可以正常工作,但在Web API控制器中會引發錯誤。
[HttpGet]
public IActionResult userProfile()
{
if (ModelState.IsValid)
{
var user = _userManager.Users.First(x => x.Email == User.Identity.Name);
return Ok(new UserViewModel
{
Id = user.Id,
UserName = user.Email,
FirstName = user.FirstName,
LastName = user.LastName
});
}
else
{
return BadRequest(ModelState);
}
}
更新
[HttpGet]
[Authorize(Roles = "Client, Administrator")]
public IActionResult userProfile()
{
string baseUrl = "https://localhost:5001";
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(baseUrl);
var contentType = new MediaTypeWithQualityHeaderValue("application/json");
client.DefaultRequestHeaders.Accept.Add(contentType);
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", HttpContext.Session.GetString("token"));
UserViewModel userModel = new UserViewModel();
HttpResponseMessage response = client.GetAsync("https://localhost:5001/api/UserAPI").Result;
string stringData = response.Content.ReadAsStringAsync().Result;
userModel = JsonConvert.DeserializeObject<UserViewModel>(stringData);
return View(userModel);
}
錯誤信息:
System.InvalidOperationException:'序列不包含任何元素
我假設您正在使用WebAPI 2。
請嘗試以下操作:
var user = _userManager.GetUser(HttpContext.User);
要么
var user = _userManager.FindById(User.Identity.GetUserId());
代替.First()將其更改為.FirstOrDefault()
API是無狀態的,這意味着沒有登錄用戶或會話的概念。 這是因為每個請求都是唯一的,獨立的,並且包含提供響應所需的所有信息。
API無法知道誰在發送請求,可能有1萬個人同時發送請求,那么到底誰在“登錄”呢?
因此,如果要加載用戶配置文件,則將userID作為參數發送,如下所示:
[HttpGet]
public IActionResult userProfile(string userEmail)
{
if ( !string.IsNullOrEmpty (userEmail) ) ..... etc etc
{
var user = _userManager.Users.First(x => x.Email == userEmail);
return Ok(new UserViewModel
{
Id = user.Id,
UserName = user.Email,
FirstName = user.FirstName,
LastName = user.LastName
});
}
}
附帶說明一下,如果您沒有任何輸入參數,或者輸入是原始類型(例如string或int),則ModelState.IsValid將不執行任何操作。 僅當您使用正確的規則填充模型類時,才使用ModelState.IsValid。
就我而言,我實際上可以將字符串替換為一個類
public class UserProfileRetrieveModel
{
[Required]
public string UserEmail { get;set; }
}
然后我可以做:
[HttpGet]
public IActionResult userProfile(UserProfileRetrieveModel model)
{
if (ModelState.IsValid)
{
var user = _userManager.Users.First(x => x.Email == model.UserEmail);
//etc
}
else
{
return BadRequest(ModelState);
}
}
---問題更新后
因此看起來您有一個客戶端應用程序,並從中調用API。 我上面說的所有內容仍然適用,只需在調用API之前填充您的數據即可。
例:
public IActionResult userProfile()
{
//removed code we don't care about
string userEmail = "";// get your user email here in the MVC controller
//populate it in the api url.
//you might need to URL encode it since it will contain dots and @
string apiUrl = "https://localhost:5001/api/UserAPI/{userEmail}";
HttpResponseMessage response = client.GetAsync(apiUrl).Result;
}
您無需在API中進行任何操作,只需將所需的所有內容從MVC控制器傳遞給API。
現在,除了所有這些,您還有大量的異步問題。 該部分需要工作,盡管與問題無關。
從錯誤消息中看來,您正在嘗試從空序列中檢索元素。 因此,請檢查您是否有數據,並嘗試使用.FirstOrDefault()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.