Fab*_*ian 3 c# repository .net-core asp.net-core-2.0
我有一个 MVC 控制器,旨在从 HTTP 标头读取用户的信息。标头包含从单点登录 (SiteMinder) 返回的用户信息。SiteMinder 将用户重定向到公司登录页面,并返回到我的应用程序以及 cookie 和 HTTP 标头。HTTP 标头包含用户信息。我的控制器应该获取这些信息并将其显示在导航栏中。
这是控制器代码:
[HttpGet]
public async Task<IActionResult> GetUser()
{
var person = Request.Headers["HTTP_JHED_UID"].ToString();
if (repository.GetJhedUser(person) != null)
{
var user = await repository.GetUser(person);
var userDto = mapper.Map<User, UserForDisplayDto>(user);
return Ok(userDto);
}
else
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我对应的存储库:
public string GetJhedUser(string value)
{
return context.Users.Where(x => x.JHED_ID == value).ToString();
}
public async Task<User> GetUser(string id, bool includeRelated = true)
{
if(!includeRelated)
return await context.Users.FindAsync(id);
return await context.Users
.SingleOrDefaultAsync(s => s.JHED_ID == id);
}
Run Code Online (Sandbox Code Playgroud)
我收到 500 服务器错误。我确信标头具有这些值。
编辑:这是调试的图像。即使我尝试使用“日期”,值也没有。请注意,我将代码重构为下面 @Nkosi 的代码
如何从标题中获取这些用户的信息(在本例中只是用户名),以便我可以在 HTML 模板中显示?
不要null从控制器操作中返回。
在尝试访问标头之前检查标头是否确实存在。
重构动作,使其编码更具防御性。
[HttpGet]
public async Task<IActionResult> GetUser() {
//was the header provided?
var headerValue = Request.Headers["HTTP_JHED_UID"];
if(headerValue.Any() == false) return BadRequest(); //401
//does the person exist?
var person = headerValue.ToString();
if(repository.GetJhedUser(person) == null) return NotFound(); //404
var user = await repository.GetUser(person);
var userDto = mapper.Map<User, UserForDisplayDto>(user);
return Ok(userDto); //200
}
Run Code Online (Sandbox Code Playgroud)
存储库代码为GetJhedUser也存在问题,因为调用 linq 表达式上的字符串并没有按照您的想法进行操作。
我会进一步建议重构GetJhedUser它实际检查的内容
public bool JhedUserExists(string value) {
return context.Users.FirstOrDefault(x => x.JHED_ID == value) != null;
}
Run Code Online (Sandbox Code Playgroud)
这导致动作看起来像这样
[HttpGet]
public async Task<IActionResult> GetUser() {
//was the header provided?
var headerValue = Request.Headers["HTTP_JHED_UID"];
if(headerValue.Any() == false) return BadRequest(); //401
//does the person exist?
var person = headerValue.ToString();
if(repository.JhedUserExists(person) == false) return NotFound(); //404
var user = await repository.GetUser(person);
var userDto = mapper.Map<User, UserForDisplayDto>(user);
return Ok(userDto); //200
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13110 次 |
| 最近记录: |