C# 无法从Asp.Net Core 2.0中的HTTP标头获取标头值

C# 无法从Asp.Net Core 2.0中的HTTP标头获取标头值,c#,.net-core,repository,asp.net-core-2.0,C#,.net Core,Repository,Asp.net Core 2.0,我有一个MVC控制器,旨在从HTTP头读取用户信息。标题包含从单一登录SiteMinder返回的用户信息。SiteMinder将用户重定向到公司登录页面,并返回到我的应用程序以及cookie和HTTP头。HTTP标头包含用户的信息。我的控制器应该获取这些信息并将其显示在导航栏中 以下是控制器代码: [HttpGet] public async Task<IActionResult> GetUser() { var person = Request.Headers["HTTP_

我有一个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;
    }

}
这是我对应的存储库:

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);
}
我收到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
}
这导致动作看起来像这样

[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
}
不要从控制器操作返回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
}
这导致动作看起来像这样

[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
}

您是否尝试检查-if Request.Headers[HTTP\u JHED\u UID].Count>0?是。我仍然收到500个服务器错误。应该是if Request.Headers[HTTP\u JHED\u UID]。任何错误,但主要问题是-您得到的确切异常是什么?JSON响应中的语法错误意味着您在响应中得到了一个错误html页面,那么里面有什么呢?我将代码重构为下面的@Nkosi代码。我现在收到一个坏的请求。我认为问题不在客户方面。控制器无法获取标头值。至少现在您可以更好地调查真正的问题是什么,因为该操作正在提供相关响应。您是否尝试检查-if Request.Headers[HTTP\u JHED\u UID]。计数>0?是。我仍然收到500个服务器错误。应该是if Request.Headers[HTTP\u JHED\u UID]。任何错误,但主要问题是-您得到的确切异常是什么?JSON响应中的语法错误意味着您在响应中得到了一个错误html页面,那么里面有什么呢?我将代码重构为下面的@Nkosi代码。我现在收到一个坏的请求。我认为问题不在客户方面。不知何故,控制器没有得到标题值。至少现在你可以更好地调查真正的问题是什么,因为该操作提供了相关的响应。不!还是不走运。我刚刚添加了带有日期标题的调试窗口。@FabianEssenberg请求实际有哪些标题?检查请求头是否同时包含日期和HTTP\U JHED-UID。看起来像是请求。头[Date]或请求。头[HTTP\U JHED\U ID]被检索。基本上,我没有从头球中得到任何东西。甚至不是标准的。不!还是不走运。我刚刚添加了带有日期标题的调试窗口。@FabianEssenberg请求实际有哪些标题?检查请求头是否同时包含日期和HTTP\U JHED-UID。看起来像是请求。头[Date]或请求。头[HTTP\U JHED\U ID]被检索。基本上,我没有从头球中得到任何东西。甚至不是标准的。