【问题标题】:ASP.NET Core MVC - Adding element permanently to Dictionary in ActionASP.NET Core MVC - 将元素永久添加到 Dictionary in Action
【发布时间】:2017-05-13 19:04:35
【问题描述】:

我正在开发一个 ASP.NET Core MVC Web 应用程序。我有一个包含字典的模型。在一个动作中,我向它添加了一个新元素。然后我还有其他操作应该使用刚刚添加的 Dictionary 中的对象。但事实证明 - 在第一个动作完成执行后,字典是空的。有没有办法修复它,以便将对象永久添加到字典中?

更新: 嗯,我需要存储的对象基本上是带有 Deep Zoom 切片生成器的虚拟医疗幻灯片。流程如下:用户点击链接打开幻灯片 -> ViewSlide Action 创建幻灯片对象 -> 然后对应视图上的 OpenSeadragon 查看器发送请求获取 XML 元数据和各种 Deep Zoom 上的 JPEG 瓦片(256x256)级别(基于鼠标光标位置)。所以会有很多对图块的请求,我正在寻找一种方法来优化创建它们所需的时间。

这是上述动作的代码sn-p:

[Route("[controller]/{slug}")]
public IActionResult ViewSlide(string slug)
{
    try
    {
        var currentSlide = slideSet.Get(slug);
        return View(currentSlide);
    }
    catch (Exception)
    {
        return RedirectToAction("Index");
    }

}

public Slide Get(string slideUrl)
{
    if (Slides.ContainsKey(slideUrl))
        return Slides[slideUrl];

    var pathToSlide = FilePaths[slideUrl];

    Slides[slideUrl] = new Slide(pathToSlide);

    return Slides[slideUrl];
}

[Produces("application/xml")]
[Route("[controller]/{slug}.dzi")]
public string Dzi(string slug)
{
    try
    {
        return slideSet.Get(slug).DeepZoomGenerator.GetDziMetadataString(DEEPZOOM_FORMAT);
    }
    catch (Exception)
    {
        RedirectToAction("Index");
        return "";
    }
}

【问题讨论】:

    标签: c# asp.net asp.net-mvc dictionary


    【解决方案1】:

    如果您想永久添加该项目,您可以将其存储在:

    1. 会话(不适用于网络场)
    2. Cookie
    3. 数据库
    4. 文件

    下面是如何在会话中存储它:

    // Place something in session
    System.Web.HttpContext.Current.Session["whatever"] = value;
    
    // Read from session
    var whatever = System.Web.HttpContext.Current.Session["whatever"];
    

    MVC 还提供了TempData,它基本上是一个会话,它存在于服务器上的行程生命周期中。

    【讨论】:

      【解决方案2】:

      根据您希望如何使用这些数据,您有不同的选择:

      • 您可以将它存储在SessionCookieTempData,如果它与客户端绑定,并且没有其他人需要它。您希望将数据存储多长时间? Cookies可以清除,也不想在Session中长时间持有太多数据。
      • 如果数据不属于特定用户,可以使用repository(例如单例字典/数据库/HttpCache),但是前两个需要定期清理,而HttpCache不保证持有数据,直到被请求为止。
      • 您还可以重新考虑这个概念,并保持无状态。这也使您可以更轻松地横向扩展应用程序,以及添加 HTTP 缓存,甚至反向代理。

      所以基本上这取决于您希望在操作调用之间保留什么样的数据。

      【讨论】:

      • 嗯,我需要存储的对象基本上是一个带有 Deep Zoom 切片生成器的虚拟医疗幻灯片。流程如下:用户点击链接打开幻灯片 -> ViewSlide Action 创建幻灯片对象 -> 然后对应视图上的 OpenSeadragon 查看器发送请求获取 XML 元数据和各种 Deep Zoom 上的 JPEG 瓦片(256x256)级别(基于鼠标光标位置)。所以会有很多对图块的请求,我正在寻找一种方法来优化创建它们所需的时间。
      • @Arquest 在这种情况下,我会为 XML 和 JPEG 文件使用文件级缓存,并实施清理作业以清除旧文件。如果您有一个多租户系统,也可以将其放置在文件共享中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 2016-12-13
      • 1970-01-01
      • 2011-03-25
      • 2017-01-24
      相关资源
      最近更新 更多