web-dev-qa-db-ja.com

Tempdataを使用するとアプリケーションがクラッシュする

私はASP.NETを非常に使い始めており、Visual Studio 2015で作成しているWebアプリケーションの2つのコントローラー間でオブジェクトを渡そうとしています。WebアプリケーションはASP.Net 5プレビューテンプレートWebアプリケーションを使用しています(役立つ場合) 、私はベータコード7を使用していると思いますnot DNXコア用にビルドしています5)。

TempData変数にanythingを挿入しようとするたびに、プログラムがクラッシュしているように見えます。たとえば、「作成」メソッドでは次のようにします。

        [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に移動し、「system.web」要素に「sessionState」オブジェクトを追加しようとしましたが、これはエラーに影響を与えませんでした。

私はどこでもこれの解決策を探していたので、どんな助けも非常に高く評価されます。私はそれがなんとか逃した愚かな/盲目的に明白な何かであることを望んでいます。

28
RMGT

ASP.NET 5でセッション、キャッシュなどのミドルウェアを使用するには、明示的に有効にする必要があります。

セッションを有効にするには、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();
    //...

UseSessionbefore MVC構成であることを確認してください。

38
PHeiberg

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