web-dev-qa-db-ja.com

セッションasp.netコアにアクセスできません

こんにちは私が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;


    }

助けてくれてありがとう

6
Jeinz Hernandez

_VS2017_については、このMSDNの公式記事 ASP.NET Coreでのセッションとアプリケーションの状態 に関する説明に従ってください。私が作成した次の例でシナリオをテストできます。 :以下のコードは長く見えますが、実際には、デフォルトのASP.NETから作成されるデフォルトのアプリにわずかな変更を加えるだけですコアテンプレート。以下の手順に従ってください:

  1. _VS2017_のデフォルトテンプレートを使用してASP.NET Core MVCアプリを作成する

  2. 以下に示すように、デフォルトの_Home controller_を変更します。

  3. 以下の_Startup.cs_ファイルに示すように、_Startup.cs_ファイルにセッション関連のエントリがあることを確認してください

  4. アプリを実行し、上部バーのHomeリンクをクリックします。これは、以下に示すセッション値を格納します(_Nam Wam_、_2017_、および_current date_)

  5. トップバーのAboutリンクをクリックします。セッション値がAboutコントローラーに渡されたことがわかります。しかし、これはsameコントローラー上の別のアクションへのセッション値の受け渡しをテストするだけなので、それはあなたの質問ではありませんでした。したがって、あなたの質問に答えるには、次の3つのステップに従ってください。

  6. 別のコントローラーAnotherControllerを作成します-以下に示すように、_Test.cshtml_フォルダー内に新しいアクションTest()とビュー_Views\Test_を使用します

  7. __Layout.cshtml_で、次のように_<li><a asp-area="" asp-controller="Another" asp-action="Test">Test View</a></li>_リンクの直後に別のリンク_<li>...Contact...</li>_を追加します

  8. アプリを再度実行し、最初に上部バーの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?}");
    });
}
....
_
1
nam

MVCアプリでセッションを使用するには、次のことを行う必要があります。_Microsoft.AspNetCore.Session_ NuGetパッケージをインストールします。

_Startup.cs_ ConfigureServicesAddSession()を追加します:

_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を書き込むことができます。

0
Necker