gpt4 book ai didi

asp.net-mvc - ASP.NET MVC - 在 Controller 之间共享 session 状态

转载 作者:行者123 更新时间:2023-12-04 15:28:19 26 4
gpt4 key购买 nike

我仍然不太熟悉控制反转(尽管我现在正在学习它)所以如果这是我问题的解决方案,请告诉我,我会回去学习它。

我有一对需要 Session 变量的 Controller ,由于 Session 首先是如何工作的,自然没有什么特别的事情发生,但这让我想知道在两个单独的 Controller 之间共享相关对象的最干净的方法是什么。在我的特定场景中,我有一个 UploadController 和一个 ProductController,它们相互配合以上传图像文件。当文件由 UploadController 上传时,有关上传的数据存储在 Session 中。发生这种情况后,我需要访问 ProductController 中的 session 数据。如果我在两个 Controller 中为包含我的上传信息的 Session 变量创建一个 get/set 属性,我将能够访问该数据,但同时我将违反各种 DRY,更不用说创建一个,充其量是混淆的设计,其中一个对象由两个完全断开的对象共享和修改。

你有什么建议?

确切的上下文:

文件上传 View 将文件发布到 UploadController.ImageWithpreview(),然后读取发布的文件并将其复制到临时目录。保存文件后,另一个类会生成上传图像的缩略图。然后将原始文件和生成的缩略图的路径与 JsonResult 一起返回到 javascript 回调,该回调更新页面上可以“保存”或“取消”的表单中的一些动态内容。无论上传的图像是保存还是跳过,我都需要移动或删除它以及临时目录中生成的缩略图。为方便起见,UploadController 在 session 维护的队列对象中跟踪所有上传文件及其缩略图。

返回 View :在表单中填充了上传图像的生成缩略图后,表单将回发到 ProductsController 中标识所选文件(目前我将文件名存储在 Hidden 字段中,我意识到这是一个可怕的漏洞),然后从临时目录复制到一个永久位置。理想情况下,我只想访问我存储在 session 中的队列,这样表单就不需要像现在一样包含图像位置。这就是我设想我的解决方案的方式,但我会热切地听取任何评论或批评。

最佳答案

想到了几个解决方案。您可以使用映射到请求并获取/设置信息的“SessionState”类(我是从内存中执行此操作,因此这不太可能编译并且旨在传达这一点):

internal class SessionState
{
string ImageName
{
get { return HttpContext.Current.Session["ImageName"]; }
set { HttpContext.Current.Session["ImageName"] = value; }
}
}

然后从 Controller 中,执行以下操作:
  var sessionState = new SessionState();
sessionState.ImageName = "xyz";
/* Or */
var imageName = sessionState.ImageName;

或者,您可以创建一个 Controller 扩展方法:
public static class SessionControllerExtensions
{
public static string GetImageName(this IController controller)
{
return HttpContext.Current.Session["ImageName"];
}

public static string SetImageName(this IController controller, string imageName)
{
HttpContext.Current.Session["ImageName"] = imageName;
}
}

然后从 Controller :
  this.SetImageName("xyz");
/* or */
var imageName = this.GetImageName();

这当然是 DRY。也就是说,我并不特别喜欢这些解决方案中的任何一个,因为我更喜欢在 session 中存储少量数据(如果有的话)。但是,如果您打算保留所有这些信息,而不必从其他来源加载/识别它,那么这是我能想到的最快(最脏)的方法。我很确定有一个更优雅的解决方案,但我没有关于您正在尝试做什么以及问题域是什么的所有信息。

请记住,在 session 中存储信息时,您必须通过序列化对对象进行脱水/再水合,并且您可能无法通过这种方式获得您认为的性能。

希望这可以帮助。

编辑:响应附加信息
不确定您要在哪里部署它,但“实时”处理图像是受到 DoS 攻击的必经之路。我给你的建议如下——这是假设这是面向公众的,任何人都可以上传图片:

1) 允许用户上传图片。此图像进入处理队列以供应用程序或某些服务进行后台处理。此外,图像的名称进入用户的个人处理队列——可能是数据库中的一个表。可以在@ Schedule a job in hosted web server 中找到有关 Web 应用程序中后台处理的信息。

2) 处理这些图像,并在处理的同时显示“处理图形”。您可以在产品页面上有一个 ajax 请求,它检查正在处理的图像并尝试每 X 秒重新加载它们。

3) 在“处理”图像时,用户可以选择不处理,假设他们是上传图像的人。这可以在显示图像的产品页面上或在单独的“用户队列” View 中使用,这将允许他们从考虑中删除图像。

因此,您最终会得到更多的域对象,而这些对象由队列管理。我强烈主张约定优于配置,因此应预定义产品图像的最终目的地。就像是:

images/products/{id}.jpg 或者,如果是一个集合,images/products/{id}/{sequence}.jpg。

然后,您无需知道表单中的目的地。所有图像都是一样的。

然后队列需要知道临时图像的上传位置以及产品 ID 是什么。队列 worker 从队列中弹出项目,处理它们并相应地存储它们。

我知道这听起来比您最初想要的更“结构化”,但我认为它更简洁。

关于asp.net-mvc - ASP.NET MVC - 在 Controller 之间共享 session 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1258422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com