実現したいこと
HttpContextのSessionクラスへSetStringメソッドを用いた書込みの実現
前提
現在BlazorServerを使ったアプリケーション開発を行っております。
その中で、各セッションごとにユーザー情報などを管理するために
HttpContextのSessionクラスへ、SetStringを用いた書込み処理を実装しておりますが、
下記のエラーが発生しており書込みに失敗しております。
なお、当エラーについては同じソースコードで発生する環境とそうでない環境があるため、
何らかの設定が起因しているものと推測しております。
エラーメッセージから原因を推測しておりますが、
ブラウザの設定などいろいろと見直してみたものの解決に至っておりません。
御助力いただけますと幸いです。
発生している問題・エラーメッセージ
(一部マスキング)
System.InvalidOperationException
HResult=0x80131509
Message=The session cannot be established after the response has started.
Source=Microsoft.AspNetCore.Session
スタック トレース:
場所 Microsoft.AspNetCore.Session.DistributedSession.Set(String key, Byte[] value)
場所 Microsoft.AspNetCore.Http.SessionExtensions.SetString(ISession session, String key, String value)
場所 ○○○○.Data.SessionControl.SetSessionInfo(String key, Object value)(C:\visualstudiopj\source\○○○○\○○○○\Data\SessionControl.cs):行 ○○
場所 ○○○○.Pages.SessionID.<SetSessionInfo>d__14.MoveNext()(C:\visualstudiopj\source\○○○○\○○○○\Pages\SessionID.razor):行 ○○
この例外は、最初にこの呼び出し履歴
[外部コード]
○○○○.Data.SessionControl.SetSessionInfo(string, object) (SessionControl.cs 内)
○○○○.Pages.SessionID.SetSessionInfo() (SessionID.razor 内) でスローされました
該当のソースコード
C#
1public void SetSessionInfo(string key, object value) 2 { 3 HttpContext httpContext = _httpContextAccessor.HttpContext; 4 ISession session = httpContext.Session; 5 // 格納するデータをJSON文字列にシリアライズして取得 6 string jsonValue = JsonSerializer.Serialize(value); 7 // セッションに指定されたキーでJSON文字列を格納 8 session.SetString(key, jsonValue); 9 }
試したこと
●環境
・ブラウザで履歴データ(Cookie含む)削除
・ブラウザのプライバシー設定変更(Cookieなどブロックしないように設定)
・サイトlocalhostのセキュリティ例外に追加
・強化型トラッキング防止機能の例外にlocalhostを追加(Firefox)
・Ignite UIのアンインストール
●PG
・Program.csの書き換え
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
・セッションインタフェースのキャスト(ISession→DistributedSession)
・IHttpContextAccessorをコンストラクタではなくメソッドのパラメタでで引き渡し
補足情報(FW/ツールのバージョンなど)
・FW
Blazor Server
・言語
C#、razor
・IDE
VisualStudio2022
回答2件
あなたの回答
tips
プレビュー