Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web API 2:如何声明可在控制器中访问的全局每个用户变量?_C#_Asp.net Web Api2 - Fatal编程技术网

C# Web API 2:如何声明可在控制器中访问的全局每个用户变量?

C# Web API 2:如何声明可在控制器中访问的全局每个用户变量?,c#,asp.net-web-api2,C#,Asp.net Web Api2,我有一个WebAPI2(MVC)项目。调用任何方法时,都需要X-API-Key头。X-API-Key用于区分UAT、产品/站点和移动应用程序调用。 我有一个消息处理程序,它在调用到达目标方法之前验证X-API-Key并设置每个用户的全局变量,因此在发送任何响应之前,这些变量可用于原始调用中的任何控制器。 主要要求是每个用户的全局变量应该是唯一的,并且不能在方法调用之间共享。 所以静态变量不起作用,也尝试使用HttpContext.Current.Cache,但也不起作用。有什么建议吗 谢谢大

我有一个WebAPI2(MVC)项目。调用任何方法时,都需要X-API-Key头。X-API-Key用于区分UAT、产品/站点和移动应用程序调用。 我有一个消息处理程序,它在调用到达目标方法之前验证X-API-Key并设置每个用户的全局变量,因此在发送任何响应之前,这些变量可用于原始调用中的任何控制器。 主要要求是每个用户的全局变量应该是唯一的,并且不能在方法调用之间共享。 所以静态变量不起作用,也尝试使用HttpContext.Current.Cache,但也不起作用。有什么建议吗


谢谢大家的关注

我相信我找到了我想要的:

“与会话集合不同,您放入Items集合的内容只在单个web请求期间存在,而会话集合将为每个用户保留内容,只要他们继续发出请求。”

这就是我现在要使用的:

在SharedLibrary方法中设置“每用户全局”变量:

HttpContext.Current.Items.Add("EnableDebugMode", true);
public static bool GetEnableDebugMode()
{
    return HttpContext.Current.Items.Contains("EnableDebugMode") ? (bool)HttpContext.Current.Items["EnableDebugMode"] : false;
}
使用SharedLibrary方法获取“每用户全局”变量:

HttpContext.Current.Items.Add("EnableDebugMode", true);
public static bool GetEnableDebugMode()
{
    return HttpContext.Current.Items.Contains("EnableDebugMode") ? (bool)HttpContext.Current.Items["EnableDebugMode"] : false;
}
在CustomerController中使用“每用户全局”变量:

catch (Exception e)
{
    _r.ResponseCode = "002";
    if (UserSession.GetEnableDebugMode())
    {
        _r.ResponseBody = e.InnerException == null ? e.Message : e.Message + "  " + e.InnerException.Message;
    }
    else
    {
        _r.ResponseBody = e.Message;
    }
    return Content(HttpStatusCode.InternalServerError, _r);
}

请不要将代码作为图像发布。它可以只是每个请求变量吗?为什么是全局的,为什么是每个用户。您在CustomerController中的用法看起来似乎只是在当前请求中使用。每个用户的Globals是一个主要的反模式(当您扩展到多个实例时会发生什么;等等),每个请求意味着每次我都需要验证客户端API密钥(X-API-Key头),这是我不想验证的。每次调用都会经过APIKeyHandler,在那里我会验证客户端API密钥(X-API-Key头),设置“每个用户/调用的全局”变量,这样我就可以在调用的方法中使用它们。从安全角度来看,您确实需要在每个请求上验证密钥(因为您不能信任客户端)。但是,您可以通过缓存以前验证过的结果来优化该验证。该缓存可以是一个静态变量,您可以随时清除它,然后重新构建它。