[解決済み】ASP.NET Web APIを使用したセッションへのアクセス
質問
セッションとRESTは必ずしも相性が良いとは言えないと思いますが、新しいWeb APIを使ってセッションの状態にアクセスすることはできないのでしょうか?
HttpContext.Current.Session
は常に null です。
解決方法は?
<ブロッククオートMVC
MVCプロジェクトでは、次の変更を行います(WebFormsとDot Net Coreの答えは下にあります)。
WebApiConfig.cs
public static class WebApiConfig
{
public static string UrlPrefix { get { return "api"; } }
public static string UrlPrefixRelative { get { return "~/api"; } }
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
グローバル.アサックス.cs
public class MvcApplication : System.Web.HttpApplication
{
...
protected void Application_PostAuthorizeRequest()
{
if (IsWebApiRequest())
{
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
}
private bool IsWebApiRequest()
{
return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative);
}
}
このソリューションには、AJAXコールを行うためにjavascriptでベースURLを取得することができるという利点があります。
_Layout.cshtml
<body>
@RenderBody()
<script type="text/javascript">
var apiBaseUrl = '@Url.Content(ProjectNameSpace.WebApiConfig.UrlPrefixRelative)';
</script>
@RenderSection("scripts", required: false)
そして、Javascriptファイル/コード内で、セッションにアクセスするためのwebapiコールを行うことができます。
$.getJSON(apiBaseUrl + '/MyApi')
.done(function (data) {
alert('session data received: ' + data.whatever);
})
);
<ブロッククオート
ウェブフォーム
上記を実行しますが、WebApiConfig.Register関数を変更して、代わりにRouteCollectionを受け取るようにします。
public static void Register(RouteCollection routes)
{
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
そして、Application_Startで以下を呼び出します。
WebApiConfig.Register(RouteTable.Routes);
<ブロッククオート
ドットネットコア
を追加します。 Microsoft.AspNetCore.Session NuGet パッケージを使用し、以下のコードを変更します。
スタートアップ.cs
を呼び出す。 AddDistributedMemoryCache と セッションの追加 メソッドを使用することで、ConfigureServices 関数内でサービスオブジェクトにアクセスできます。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
...
services.AddDistributedMemoryCache();
services.AddSession();
という呼び出しを追加し、Configure 関数で セッションを使用する :
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
app.UseSession();
app.UseMvc();
セッションコントローラ(SessionController.cs)
コントローラ内で、一番上にusingステートメントを追加します。
using Microsoft.AspNetCore.Http;
を作成し、コード内でHttpContext.Sessionオブジェクトを以下のように使用します。
[HttpGet("set/{data}")]
public IActionResult setsession(string data)
{
HttpContext.Session.SetString("keyname", data);
return Ok("session data set");
}
[HttpGet("get")]
public IActionResult getsessiondata()
{
var sessionData = HttpContext.Session.GetString("keyname");
return Ok(sessionData);
}
が打てるようになったはずです。
http://localhost:1234/api/session/set/thisissomedata
で、このURLにアクセスすると、それが引き出されます。
http://localhost:1234/api/session/get
ドットネットコアのセッションデータへのアクセスについて、詳しくはこちらをご覧ください。 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state
<ブロッククオートパフォーマンスに関する懸念
パフォーマンスについては、以下のSimon Weaver氏の回答をお読みください。WebApiプロジェクト内でセッションデータにアクセスしている場合、パフォーマンスに深刻な影響が出る可能性があります。ASP.NETが同時リクエストに対して200msの遅延を強制するのを見たことがあります。ASP.NETが同時リクエストに200msの遅延を強制するのを見たことがあります。これは、多くの同時リクエストがある場合、積み重なって悲惨なことになるかもしれません。
<ブロッククオート
セキュリティへの配慮
ユーザーごとにリソースをロックしていることを確認してください。認証されたユーザーは、アクセス権のないデータをWebApiから取得できないようにする必要があります。
ASP.NET Web APIにおける認証と認可に関するマイクロソフトの記事をお読みください。 https://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
クロスサイトリクエストフォージェリーのハッキング攻撃を回避するためのマイクロソフトの記事を読んでください。(要するに、AntiForgery.Validateメソッドをチェックアウトしてください) -。 https://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks
関連
-
[解決済み] Microsoft Jet データベースエンジンは、オブジェクト 'Sheet1$' を見つけられませんでした。
-
[解決済み] ASP.net MVCのviewstateに相当するものは何か【終了しました
-
[解決済み] Url.Actionのパラメータ?
-
[解決済み] クライアントから危険な可能性のあるRequest.Formの値が検出された
-
[解決済み] Chromeを使用してASP.NET Web APIがXMLの代わりにJSONを返すようにするにはどうすればよいですか?
-
[解決済み] ASP.NET WebサイトとASP.NET Webアプリケーションのどちらを選ぶか?
-
[解決済み】Web APIからHttpClientでJsonObjectをPOSTする。
-
[解決済み】ASP.NET Web APIでコントローラからバイナリファイルを返す。
-
[解決済み] ASP.NET Web APIでのユーザー認証
-
[解決済み] 現在のASP.NETセッションがNULLの場合、どうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] レイアウトページ"~/Views/Shared/_Layout.cshtml "では、以下のセクションは定義されていますが、レンダリングは行われていません。"スクリプト"
-
[解決済み] vti_cnf」「_vti_pvt」「_vti_script」「_vti_txt」フォルダは何ですか?
-
[解決済み] 複数行のテキストボックスの複数改行
-
[解決済み] ASP.NETでページを更新するにはどうすればよいですか?(コードで勝手に再読み込みさせる)。
-
[解決済み] パフォーマンスカウンターにアクセスすると「レジストリキー'Global'へのアクセスは拒否されました」と表示される。
-
[解決済み] ASP.NETのボタンに画像を追加することはできますか?
-
EntityFramework のエラーです。エンティティタイプXXXは、現在のコンテキストのモデルの一部ではありません。
-
ASP.NET図書館管理システム簡易実装ステップ
-
asp.netのPostとGetデータの取得方法
-
[解決済み] 現在のASP.NETセッションがNULLの場合、どうすればよいですか?