2015-11-19 2 views
25

Я очень новичок в ASP.NET и пытаюсь передать объект между двумя контроллерами в веб-приложении, которое я создаю в Visual Studio 2015. Веб-приложение использует ASP.Net 5 Preview Template Web-приложение (если это помогает, я думаю, что я использую бета-код 7, и я не здание для DNX Core 5).Использование Tempdata сбой моего приложения

Проблема, с которой я столкнулся, - это когда я пытаюсь поставить что-нибудь в переменную 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(); 
    } 

В этом методе, я пытаюсь добавить простую тестовую строку под ключ «тест». Когда я запускаю приложение с этим заявлением TempData там, я получаю сообщение об ошибке с сообщением

Необработанное исключение возникло во время обработки запроса.

InvalidOperationException: сеанс не настроен для этого приложения> или запроса. Microsoft.AspNet.Http.Internal.DefaultHttpContext.get_Session()

Я пытался идти в Web.config, расположенный в Wwwroot элемента проекта и добавления «sessionState» объект в «system.web ", но это не повлияло на ошибку.

Любая помощь будет очень оценена так, как я искал решения для этого везде. Я надеюсь, что это что-то глупое/ослепительно очевидное, что я как-то пропустил.

+1

Вы добавили пакет nuget Microsoft.AspNet.Session и добавили промежуточное ПО сеанса в класс «Startup»? – PHeiberg

+0

Извинения за задержку, Pheilberg.Я попытался добавить этот пакет Nuget индивидуально, и это вызвало множество странных ошибок («iApplicationBuilder определен в пакете, на который не ссылаются» или что-то в этом роде), но я читаю ответ, который вы оставили, и попробуете все это , Большое спасибо за предложения, и я пометю его, если он сработает! – RMGT

+1

Если вы не можете заставить его работать, ознакомьтесь с [session sample] (https://github.com/aspnet/Session/tree/dev/samples/SessionSample) в [Session Github Repo] (https://github.com/aspnet/Session/). Если вы все еще не можете заставить его работать, отправьте код 'project.json' и' Startup.cs'. – PHeiberg

ответ

37

Чтобы использовать промежуточное программное обеспечение, такое как Session, Cache и т. Д. В ASP.NET 5, вы должны их явно разрешить.

Включения сеанс осуществляется путем добавления соответствующего пакета NuGet в зависимости разделе вашего project.json файла (убедитесь, что версия пакета соответствует версиям других зависимостей, которые вы добавили):

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

и соответствующей сессия (кэш) пакет для хранения, а также (как в пример ниже, в памяти):

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

и добавление к промежуточному программному разрешению зависимостей в конфигурации Startup.cs Service:

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

и добавление к промежуточному к Owin в конфигурации Startup.cs Owin:

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

Убедитесь, что UseSession приходит перед конфигурацию MVC.

+5

Возможно, верно, верно? Для ASP.NET Core в 'congfigurationServices (...)' replace' services.AddCaching(); 'wirh' services.AddDistributedMemoryCache();' Ref: [Установка и настройка сеансов] (https://docs.microsoft. com/en-us/aspnet/core/основы/app-state # install-and-configuration-session) – nam

+1

Очевидно, пакет сеанса теперь называется «Microsoft.AspNetCore.Session». Он работал без необходимости установки кэширования в памяти. –

5

Для ядра Asp.Net убедитесь, что добавлено 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(); 
    }