2015-11-19 17 views
25

Tôi rất mới với ASP.NET và đang cố chuyển một đối tượng giữa hai bộ điều khiển trong ứng dụng web mà tôi đang tạo trong Visual Studio 2015. Ứng dụng web đang sử dụng ASP.Net 5 Xem trước mẫu ứng dụng web (nếu nó giúp, tôi nghĩ rằng tôi đang sử dụng mã beta 7 và tôi là không phải là xây dựng cho DNX Core 5).Sử dụng Tempdata đang làm hỏng ứng dụng của tôi

Sự cố tôi gặp phải là bất cứ khi nào tôi cố gắng đặt bất cứ điều gì vào biến TempData, chương trình dường như bị lỗi. Ví dụ: trong phương thức "Tạo", tôi có:

 [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(); 
    } 

Trong phương pháp đó, tôi cố gắng thêm một chuỗi thử nghiệm đơn giản dưới khóa "kiểm tra". Khi tôi chạy ứng dụng với câu lệnh TempData đó, tôi nhận được thông báo lỗi nêu rõ

Đã xảy ra lỗi ngoại lệ trong khi xử lý yêu cầu.

InvalidOperationException: Phiên chưa được định cấu hình cho ứng dụng này> hoặc yêu cầu. Microsoft.AspNet.Http.Internal.DefaultHttpContext.get_Session()

Tôi đã cố gắng đi đến Web.config nằm ở yếu tố wwwroot của dự án và thêm một "sessionState" đối tượng vào một "system.web "yếu tố, nhưng điều này không ảnh hưởng đến lỗi.

Bất kỳ trợ giúp nào sẽ được đánh giá rất cao vì tôi đã tìm kiếm các giải pháp cho việc này ở mọi nơi. Tôi hy vọng nó là một cái gì đó ngu ngốc/blindingly rõ ràng rằng tôi bằng cách nào đó bị mất.

+1

Bạn đã thêm gói nuget 'Microsoft.AspNet.Session' và thêm phần mềm trung gian phiên trong lớp' Startup' chưa? – PHeiberg

+0

Xin lỗi vì sự chậm trễ, Pheilberg.Tôi đã thử thêm gói Nuget riêng lẻ, và nó gây ra một loạt các lỗi lạ ("iApplicationBuilder được định nghĩa trong một gói không được tham chiếu" hoặc một cái gì đó tương tự), nhưng tôi đọc câu trả lời bạn còn lại và sẽ thử tất cả . Cảm ơn rất nhiều cho các đề xuất và tôi sẽ đánh dấu nó nếu nó hoạt động! – RMGT

+1

Nếu bạn không thể làm cho nó hoạt động, hãy xem [session sample] (https://github.com/aspnet/Session/tree/dev/samples/SessionSample) trong [Session Github Repo] (https://github.com/aspnet/Session/). Nếu bạn vẫn không thể làm cho nó hoạt động, hãy đăng mã 'project.json' và' Startup.cs' của bạn. – PHeiberg

Trả lời

37

Để sử dụng phần mềm trung gian, chẳng hạn như Phiên, Cache, v.v. trong ASP.NET 5, bạn phải bật chúng một cách rõ ràng.

Kích hoạt phiên được thực hiện bằng cách thêm các gói NuGet thích hợp trong phần phụ thuộc project.json tập tin của bạn (chắc chắn rằng phiên bản gói phù hợp với các phiên bản của các phụ thuộc khác mà bạn đã thêm vào):

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

và phiên thích hợp (cache) gói lưu trữ cũng như (như ví dụ dưới đây, trong bộ nhớ):

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

và thêm các trung gian để giải quyết phụ thuộc vào cấu hình Startup.cs Dịch vụ:

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

và thêm các middleware để OWIN trong cấu hình Startup.cs OWIN:

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

Hãy chắc chắn rằng UseSession đến trước cấu hình MVC.

+5

Sau đây có thể là sự thật, đúng không? Đối với ASP.NET Core, trong 'congfigurationServices (...)' thay thế 'services.AddCaching();' wirh 'services.AddDistributedMemoryCache();' Tham khảo: [Phiên cài đặt và cấu hình] (https://docs.microsoft. com/en-us/aspnet/core/nguyên tắc cơ bản/app-state # installation-and-configuring-session) – nam

+1

Rõ ràng gói phiên bây giờ được gọi là 'Microsoft.AspNetCore.Session'. Nó làm việc out-of-the-box mà không cần phải thiết lập bộ nhớ đệm trong bộ nhớ. –

5

Đối với Asp.Net Core, hãy đảm bảo thêm Asp.NetCore.Session. Bạn có thể định cấu hình phiên trong StartUp.cs như dưới đây.

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(); 
    } 
Các vấn đề liên quan