我需要能够轻松获取我们在MVC项目之外的程序集中运行的大量查询的用户名。我只想为所有调用添加一个参数,但实际上有数百个。
我的同事建议我将静态引用传递给HttpContext(可能是在OnApplicationStarted或类似的东西)并从那里获取用户名。
HttpContext始终包含有关当前用户会话的信息。我对此的关注是,如果我的对象(存在于单独的程序集中)不知道哪个用户准确地从中提取信息,并且虽然这可能适用于单个用户,但它会将错误的用户名拉为更多用户开始访问系统。
这是识别用户名的可行方法吗?
HttpContext如何知道哪个用户是当前用户?该机制是否在项目之外被切断了?
答案 0 :(得分:2)
HttpContext
实例不是全局的 - 它是特定请求的上下文。因此,例如,如果您正在执行控制器操作并且调用HttpContext
(即Controller.HttpContext
),那么您将处理该请求的上下文。因此,上下文所针对的是哪个用户 - 这是针对发起该请求的用户的问题。
您不希望从OnApplicationStarted
引用它。它要么不可用,要么是当前请求的上下文。
话虽如此,如果您需要的是用户名,那么我不确定您为什么要传递整个HttpContext
。函数应该只接收它需要的参数。如果需要用户名,您可以从HttpContext.User.Identity.Name
获取。这将使其他库更容易测试。如果调用其他库但不是来自Web应用程序会怎样?然后就不会有HttpContext
传递给它。
答案 1 :(得分:0)
不确定其他人是否在暗示这一点,但这里有......
我的同事建议我像这样引用System.Web:
var username = System.Web.HttpContext.Current.Session["user"];
我找回了一个用户名。
我不完全确定这是一个同时可靠的解决方案,但似乎没有一种方便的方法来测试它(没有精心的负载测试)。
如果两个工作线程同时调用此库,我不确定.NET框架如何知道外部库需要一个用户名来自一个地方而另一个用户来自另一个地方。