【问题标题】:Using Tempdata is crashing my application使用 Tempdata 使我的应用程序崩溃
【发布时间】:2017-07-21 23:55:20
【问题描述】:

我是 ASP.NET 的新手,我正在尝试在我在 Visual Studio 2015 中制作的 Web 应用程序中的两个控制器之间传递一个对象。该 Web 应用程序正在使用 ASP.Net 5 Preview Template Web 应用程序(如果有帮助,我想我正在使用 beta 代码 7,并且我为 DNX Core 5 构建)。

我遇到的问题是,每当我尝试将 anything 放入 TempData 变量时,程序似乎就会崩溃。例如,在“创建”方法中,我有:

        [HttpPost]
    public ActionResult Create(Query query)
    {
        switch (query.QueryTypeID)
        {
            case 1:
                TempData["Test"] = "Test";
                return RedirectToAction("Index", "EventResults");
            case 2:
                break;
            default:
                break;
        }
        return View();
    }

在该方法中,我尝试在“test”键下添加一个简单的测试字符串。当我在其中运行带有该 TempData 语句的应用程序时,我收到一条错误消息,指出

处理请求时发生未处理的异常。

InvalidOperationException:尚未为此应用程序或请求配置会话。 Microsoft.AspNet.Http.Internal.DefaultHttpContext.get_Session()

我已尝试转到位于项目的 wwwroot 元素中的 Web.config 并将“sessionState”对象添加到“system.web”元素中,但这对错误没有影响。

非常感谢任何帮助,因为我一直在到处寻找解决方案。我希望这是我以某种方式错过的愚蠢/明显的事情。

【问题讨论】:

  • 你是否添加了Microsoft.AspNet.Session nuget 包并在Startup 类中添加了会话中间件?
  • 抱歉耽搁了,Pheilberg。我曾尝试单独添加该 Nuget 包,但它导致了一堆奇怪的错误(“iApplicationBuilder 是在未引用的包中定义的”或类似的东西),但我正在阅读您留下的答案,并将尝试所有这些.非常感谢您的建议,如果有用我会标记它!
  • 如果您无法使用它,请查看Session Github Repo 中的session sample。如果您仍然无法使用它,请发布您的 project.jsonStartup.cs 代码。
  • 您的回答完美!我认为我之前遇到的问题是双重的:首先,我没有安装与我的代码运行的相同版本的 nuget 包(我的代码是 beta7,我正在下载最新的。就像我说的,这对我来说是全新的...对于可能看到此内容的其他新手,请确保您要下载的包与您在 project.json 文件中的所有依赖项是相同的 beta 版本!)。其次,我不知道我需要缓存包。非常感谢您帮助我!非常感谢!
  • 很好,你把它整理出来了。我忘了提包版本部分。

标签: c# asp.net visual-studio-2015


【解决方案1】:

为了在 ASP.NET 5 中使用 Session、Cache 等中间件,您必须显式启用它们。

通过在 project.json 文件的依赖项部分添加适当的 nuget 包来启用会话(确保包版本与您添加的其他依赖项的版本匹配):

"Microsoft.AspNet.Session": "1.0.0-*"

以及适当的会话(缓存)存储包(如下例;在内存中):

"Microsoft.Extensions.Caching.Memory": "1.0.0-*"

并将中间件添加到Startup.cs服务配置中的依赖解析:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCaching();
    services.AddSession(/* options go here */);
}

并在Startup.cs OWIN 配置中将中间件添加到 OWIN:

public void Configure(IApplicationBuilder app)
{
    app.UseSession();
    //...

确保UseSession 出现在 MVC 配置之前。

【讨论】:

  • 以下可能是真的,对吗?对于 ASP.NET Core,在 congfigurationServices(...) 替换 services.AddCaching(); wirh services.AddDistributedMemoryCache(); Ref: Installing and Configuration sessions
  • 显然会话包现在称为Microsoft.AspNetCore.Session。它开箱即用,无需设置内存缓存。
  • AddSession 参数中有哪些选项?
【解决方案2】:

对于 Asp.Net Core,确保添加了 Asp.NetCore.Session。 您可以在 StartUp.cs 中配置会话,如下所示。

public void ConfigureServices(IServiceCollection services)

    {
        services.AddMvc();
         services.AddSingleton<ITempDataProvider, CookieTempDataProvider>();
        // Adds a default in-memory implementation of IDistributedCache.
        services.AddDistributedMemoryCache();
        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.CookieHttpOnly = true;
        });
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseSession();
        app.UseMvcWithDefaultRoute();
    }

【讨论】:

  • 当我尝试添加Asp.NetCore.Session 时,我的项目将不再启动,并引发以下错误:System.TypeLoadException: 'Method 'ConfigureAppConfiguration' in type 'Microsoft.AspNetCore.Hosting.WebHostBuilder' from assembly 'Microsoft.AspNetCore.Hosting, Version=1.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' does not have an implementation.'。好像我什至无法正确添加 nuget
  • @WouterVanherck 您添加的包似乎有问题。删除包一次,清理解决方案并重新添加 nuget。
  • 感谢您的浏览。但是,在我的情况下,删除包不是一个选项,因为出现了严重错误,没有它们我无法构建项目
  • 在安装包之前,请确保根据您的 asp.net 核心框架下载或安装包。否则会有问题,
猜你喜欢
  • 2011-05-26
  • 2013-08-20
  • 2021-08-28
  • 2012-05-09
  • 2010-11-08
  • 2014-01-24
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
相关资源
最近更新 更多