質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
blazor

Blazorは、マイクロソフトが開発している.NETベースのWebアプリフレームワークです。C#でフロントエンドもバックエンドも一貫して書くことが可能。クライアントサイド(WebAssembly)とサーバーサイド形式のホスティングモデルがあります。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

1492閲覧

Blazor Server 環境下でのSessionクラスへの書き込みエラー回避

takanabekeita

総合スコア1

blazor

Blazorは、マイクロソフトが開発している.NETベースのWebアプリフレームワークです。C#でフロントエンドもバックエンドも一貫して書くことが可能。クライアントサイド(WebAssembly)とサーバーサイド形式のホスティングモデルがあります。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2023/02/07 05:41

実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/02/08 03:00

質問者さん、回答したのでそれに対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。とにかく無言は NG です。
guest

回答2

0

回答遅れ申し訳ありません、根本的な部分で勘違いしていた可能性もあるため、今一度ご指摘頂いた内容で精査したいと思います。そのうえで、また疑問点ありましたらリアクションさせてください。

投稿2023/02/08 05:48

takanabekeita

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/02/08 06:03 編集

質問者さんは回答欄に書かないようにお願いします。Teratail のスレッドの構造から、どれが質問でどれが回答なのかゴッチャになって訳が分からなくなりますので。
退会済みユーザー

退会済みユーザー

2023/02/08 06:01

Blazor Server では ASP.NET でいう Session は使えないということが確認出来たらこのスレッドはクローズ願います。 対策についての質問がある場合は、以下の記事を読むなどして検討し、方針が固まったら新たに別のスレッドを立てて質問していただくようお願いします。 ASP.NET Core Blazor 状態管理 https://learn.microsoft.com/ja-jp/aspnet/core/blazor/state-management?view=aspnetcore-7.0&pivots=server
takanabekeita

2023/02/08 06:15

初めての投稿でしたため、要領を得ず申し訳ありませんでした。 下記サイトを参照し、HttpContextの利用自体は可能なのかと考え、 そこからSession情報を取得し利用することも可能ではと考えており、 私とは別のある開発者環境では実際にSessionインスタンスの取得からIDの取得、 値のセットまでがで来ておりましたため使用できるものと考えておりました。 https://learn.microsoft.com/ja-jp/aspnet/core/blazor/security/server/threat-mitigation?view=aspnetcore-6.0 ただ、ご指摘のとおりそもそも前提が違い、私の調査不足だとおもいますので、クローズさせて頂きます。 ご支援ありがとうございました。
guest

0

ベストアンサー

SignalR をサーバーとクライアントの通信に使っている Blazor Server ではそもそも ASP.NET でいう Session は使えないはずです。

No access to the Session information through SignalR Hub. Is my design is wrong?
https://stackoverflow.com/questions/20522477/no-access-to-the-session-information-through-signalr-hub-is-my-design-is-wrong

投稿2023/02/07 06:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問