【发布时间】:2018-01-15 20:19:41
【问题描述】:
我正在尝试寻找使用会话变量的替代方法。在我的解决方案中,我有一个由 ASP.NET Web 应用程序和控制台应用程序引用的项目。这两个应用程序都可以对数据进行更改,并且在进行更改时,会针对该行记录进行更改的用户的 ID。
因此,如果只是 ASP.NET 应用程序进行更改,它可以执行类似myObj.LastUpdatedByID = Session["userid"] 的操作。鉴于命令行应用程序需要进行更改并且没有会话,我可以使用什么替代方案,它与 ASP.NET 中的会话范围等效,但在控制台应用程序范围内也可用?
我看过 MemoryCache,但这似乎是 ASP.NET 中的应用程序级别。
我不想将用户 ID 传递给每个调用。
是否会做类似检查 HttpContext 之类的事情,如果有,则从会话中提取,如果没有,则从 MemoryCahce 中提取?还是有更好的方法?
编辑: 用户 ID 在控制台应用程序中专门设置,具体取决于正在执行的操作。控制台应用程序用于自动化流程,它执行许多操作。例如,发送电子邮件过程将由用户 ID 1 执行,删除旧文件过程将由用户 ID 2 执行。在 一些 实例中,用户 ID 将设置为上次更改该行数据的用户 ID。
编辑: 一些示例代码(为简洁起见)。你可以看到我在这里使用了 MemoryCache,据我了解,这将是应用程序范围内的,因此不能在 ASP.NET 应用程序中使用:
public class Base(
{
private int auditID = -1;
public int AuditID
{
get
{
if (this.auditID <= 0)
{
ObjectCache memCache = MemoryCache.Default;
this.auditID = ((int)memCache["CurrentUserID"]);
}
return this.auditID;
}
}
}
public class MyObject : Base
{
public int LastUpdatedByID { get; set; } = 0;
public bool Save()
{
bool b = false;
this.LastUpdatedByID = this.AuditID;
//Call to DB here...
return b;
}
}
【问题讨论】:
-
如何在控制台应用中对用户进行身份验证?
-
@CodeCaster 我添加了一个编辑
-
显示更新对象的代码。类库不应引用 System.Web。
-
@CodeCaster 我添加了一个更新工作原理的示例。同意 System.Web 评论。这就是为什么我试图找到一种比检查 HttpContext 和使用会话更好的方法,如果不使用 MemoryCache
-
您已经在使用 IoC 模式了吗?看来您可以有一个
IIdentifyUser接口,可以将其注入到需要了解用户的类中,然后构建简单的 Asp.Net 和 Console 实现。 (显然,控制台不允许一次请求多个操作,使其成为非线程安全的,但同样如此,您的内存缓存建议也不会。如果您需要控制台应用程序中的线程安全,您几乎可以肯定必须字节子弹并传递参数)
标签: c# asp.net session caching console-application