こんにちは私がasp.netコアでセッションをテストしようとしているのを手伝ってくださいが、セッションを設定して他のコントローラーから取得すると、nullのように見えます
私のスタートアップをここに
public class Startup
{
public IConfigurationRoot Configuration { get; }
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc().AddJsonOptions(options => {
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
// Adds a default in-memory implementation of IDistributedCache.
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
// Set a short timeout for easy testing.
options.IdleTimeout = TimeSpan.FromSeconds(600);
options.CookieHttpOnly = true;
});
services.AddSingleton<IConfiguration>(Configuration);
services.AddSingleton<Microsoft.AspNetCore.Http.IHttpContextAccessor, Microsoft.AspNetCore.Http.HttpContextAccessor>();
services.AddTransient<IApiHelper, ApiHelper>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseSession();
app.UseDeveloperExceptionPage();
if (env.IsDevelopment())
{
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions {
HotModuleReplacement = true,
ReactHotModuleReplacement = true
});
}
//var connectionString = Configuration.GetSection("ConnectionStrings").GetSection("ClientConnection").Value;
app.UseStaticFiles();
loggerFactory.AddConsole();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapSpaFallbackRoute(
name: "spa-fallback",
defaults: new { controller = "Home", action = "Index" });
});
}
public static void Main(string[] args) {
var Host = new WebHostBuilder()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseKestrel()
.UseStartup<Startup>()
.Build();
Host.Run();
}
}
そして、これは私がセッションを設定する方法です
public class HomeController : Controller
{
public IActionResult Index()
{
HttpContext.Session.SetString("Test", "Ben Rules!");
return View();
}
public IActionResult Error()
{
return View();
}
}
そしてここで再びセッションを取得する私のサンプルコードがnullのようです
[HttpGet("[action]")]
public IEnumerable<JobDescription> GetJobDefinitions()
{
//this is always null
var xd = HttpContext.Session.GetString("Test");
var x = _apiHelper.SendRequest<Boolean>($"api/JobRequest/GetJobRequest",null);
var returnValue = new List<JobDescription>();
returnValue = jobDescriptionManager.GetJobDescriptions();
return returnValue;
}
助けてくれてありがとう
_VS2017
_については、このMSDNの公式記事 ASP.NET Coreでのセッションとアプリケーションの状態 に関する説明に従ってください。私が作成した次の例でシナリオをテストできます。 注:以下のコードは長く見えますが、実際には、デフォルトのASP.NETから作成されるデフォルトのアプリにわずかな変更を加えるだけですコアテンプレート。以下の手順に従ってください:
_VS2017
_のデフォルトテンプレートを使用してASP.NET Core MVCアプリを作成する
以下に示すように、デフォルトの_Home controller
_を変更します。
以下の_Startup.cs
_ファイルに示すように、_Startup.cs
_ファイルにセッション関連のエントリがあることを確認してください
アプリを実行し、上部バーのHome
リンクをクリックします。これは、以下に示すセッション値を格納します(_Nam Wam
_、_2017
_、および_current date
_)
トップバーのAbout
リンクをクリックします。セッション値がAbout
コントローラーに渡されたことがわかります。しかし、これはsame
コントローラー上の別のアクションへのセッション値の受け渡しをテストするだけなので、それはあなたの質問ではありませんでした。したがって、あなたの質問に答えるには、次の3つのステップに従ってください。
別のコントローラーAnotherController
を作成します-以下に示すように、_Test.cshtml
_フォルダー内に新しいアクションTest()
とビュー_Views\Test
_を使用します
__Layout.cshtml
_で、次のように_<li><a asp-area="" asp-controller="Another" asp-action="Test">Test View</a></li>
_リンクの直後に別のリンク_<li>...Contact...</li>
_を追加します
アプリを再度実行し、最初に上部バーのHome
リンクをクリックします。次に、上部バーのTest
リンクをクリックします。セッション値がHomController
からAnotherController
に渡され、Test
ビューに正常に表示されたことがわかります。
HomeController:
_using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
namespace MyProject.Controllers
{
public class HomeController : Controller
{
const string SessionKeyName = "_Name";
const string SessionKeyFY = "_FY";
const string SessionKeyDate = "_Date";
public IActionResult Index()
{
HttpContext.Session.SetString(SessionKeyName, "Nam Wam");
HttpContext.Session.SetInt32(SessionKeyFY , 2017);
// Requires you add the Set extension method mentioned in the SessionExtensions static class.
HttpContext.Session.Set<DateTime>(SessionKeyDate, DateTime.Now);
return View();
}
public IActionResult About()
{
ViewBag.Name = HttpContext.Session.GetString(SessionKeyName);
ViewBag.FY = HttpContext.Session.GetInt32(SessionKeyFY);
ViewBag.Date = HttpContext.Session.Get<DateTime>(SessionKeyDate);
ViewData["Message"] = "Session State In Asp.Net Core 1.1";
return View();
}
public IActionResult Contact()
{
ViewData["Message"] = "Contact Details";
return View();
}
public IActionResult Error()
{
return View();
}
}
public static class SessionExtensions
{
public static void Set<T>(this ISession session, string key, T value)
{
session.SetString(key, JsonConvert.SerializeObject(value));
}
public static T Get<T>(this ISession session, string key)
{
var value = session.GetString(key);
return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
}
}
}
_
About.cshtml[same
コントローラからのセッション変数値の表示]
_@{
ViewData["Title"] = "ASP.Net Core !!";
}
<h2>@ViewData["Title"].</h2>
<h3>@ViewData["Message"]</h3>
<table class="table table-responsive">
<tr>
<th>Name</th>
<th>Fiscal Year</th>
</tr>
<tr>
<td>@ViewBag.Name</td>
<td>@ViewBag.FY</td>
</tr>
</table>
<label>Date : @(ViewBag.Date.ToString("dd/MM/yyyy") != "01/01/0001" ? ViewBag.Date.ToString("dd/MM/yyyy") : "")</label>
_
AnotherController[HomeControllerとは異なるコントローラー]:
_using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
public class AnotherController : Controller
{
const string SessionKeyName = "_Name";
const string SessionKeyFY = "_FY";
const string SessionKeyDate = "_Date";
// GET: /<controller>/
public IActionResult Test()
{
ViewBag.Name = HttpContext.Session.GetString(SessionKeyName);
ViewBag.FY = HttpContext.Session.GetInt32(SessionKeyFY);
ViewBag.Date = HttpContext.Session.Get<DateTime>(SessionKeyDate);
ViewData["Message"] = "Session State passed to different controller";
return View();
}
}
_
Test.cshtml:[ホームコントローラからAnother
コントローラに渡されたセッション変数値の表示]
_@{
ViewData["Title"] = "View sent from AnotherController";
}
<h2>@ViewData["Title"].</h2>
<h3>@ViewData["Message"]</h3>
<table class="table table-responsive">
<tr>
<th>Test-Name</th>
<th>Test-FY</th>
</tr>
<tr>
<td>@ViewBag.Name</td>
<td>@ViewBag.FY</td>
</tr>
</table>
<label>Date : @(ViewBag.Date.ToString("dd/MM/yyyy") != "01/01/0001" ? ViewBag.Date.ToString("dd/MM/yyyy") : "")</label>
_
_ Layout.cshtml:
_....
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
<li><a asp-area="" asp-controller="Home" asp-action="About">About</a></li>
<li><a asp-area="" asp-controller="Home" asp-action="Contact">Contact</a></li>
<li><a asp-area="" asp-controller="Another" asp-action="Test">Test View</a></li>
</ul>
</div>
....
_
Startup.cs:[セッション関連のエントリが含まれていることを確認してください。ほとんどの場合、VS2017でASP.NET Core MVCアプリを作成したときに、これらのエントリは既に存在しています。ただし、確認してください。]
_....
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//In-Memory
services.AddDistributedMemoryCache();
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromMinutes(1);//Session Timeout.
});
// Add framework services.
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
....
_
MVCアプリでセッションを使用するには、次のことを行う必要があります。_Microsoft.AspNetCore.Session
_ NuGetパッケージをインストールします。
_Startup.cs
_ ConfigureServices
にAddSession()
を追加します:
_services.AddMvc();
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromHours(1);
});
_
_Startup.cs
_ configureにUseSession()
を追加します:
_app.UseSession();
app.UseMvc();
_
そして今、あなたはコントローラでそれを使うことができます:
セッションを設定する
_string token="xx";
HttpContext.Session.SetString("UserToken", token);
_
保存された値を取得する
_var token = HttpContext.Session.GetString("UserToken");
_
さらに、ASP.NET Core 2.1以降では、Cookie同意ダイアログなどの拡張ポイントがいくつか導入されました。したがって、ユーザーからのCookieを保存することに同意が必要です。
プライバシーバナーの[同意する]をクリックすると、ASP.NET CoreはセッションCookieを書き込むことができます。