Session.SetString () на стороне сервера. NET Core выдает ошибку «Сеанс не может быть установлен после начала ответа» - PullRequest
0 голосов
/ 12 марта 2020

У меня есть приложение Blazor размером с сервер, которому нужно что-то записать в сеанс при первой загрузке страницы, а затем прочитать его из сеанса на этой странице и на других страницах.

Прямо сейчас, этот сеанс. String () вызывается в OnInitializedAsyn c (). Однако я получаю исключение «Сеанс не может быть установлен после начала ответа». Из скудной документации, которую я нашел, это обычно происходит, когда SignalR используется с приложением.

1) Я не думаю, что я использую SignalR, если он не настроен по умолчанию для использования на стороне сервера. net основной код (в каком случае, как мне узнать?) 2) Я также попытался поместить вызов в OnInitialized () и onAfterRender () (синхронные методы), что не помогло. 3) Я думаю, что мои HTTPContextAccessor и ISession настроены правильно, потому что я могу использовать Session.GetString () в любое время, в том числе прямо перед вызовом Session.SetString (). 4) Я не могу переключиться на клиентское приложение Blazor по разным причинам. 5) Я использую app.UseEndpoints (), поэтому app.use Mvc () закомментировано, потому что их нельзя использовать одновременно.

У кого-нибудь есть идеи, что может быть не так, прежде чем я вставлю сюда очень большие куски кода? Ниже приведены фрагменты того, что у меня есть

//Startup.cs
public IHttpContextAccessor HtppContextAccessor { get; }
// ...

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();

    services.AddHttpContextAccessor();

    //services.AddMvc(); //TODO: DO I NEED IT?
    services.AddDistributedMemoryCache();  //TODO : DO I NEED IT? // Adds a default in-memory implementation of IDistributedCache
    services.AddSession();

    //services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();


}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseSession();


    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();


    app.UseEndpoints(endpoints =>
    {
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });

}

//**************************************************************************
//myfile.razor

protected override async Task OnInitializedAsync()
{
    var sampleValue = Session.GetString("testName1"); //this call is ok
    Session.SetString("testName1", "testValue2"); //this is where exception occurs
}

Спасибо

1 Ответ

0 голосов
/ 12 марта 2020

Вероятно, это связано с тем, что Asp. Net Ядро не будет записывать какие-либо файлы cookie (включая сессионный повар ie) в ответ, если конечный пользователь не даст свое согласие в соответствии с Общим регламентом ЕС о защите данных (GDPR). который поддерживается в ASP. NET Core и по умолчанию получает согласие пользователя.

https://docs.microsoft.com/en-us/aspnet/core/security/gdpr?view=aspnetcore-2.2

Вы можете попытаться установить сеанс Приготовьте ie, поскольку это необходимо для вашего приложения, чтобы преодолеть это:

(Из документации:)

Файлы cookie состояния сеанса не являются необходимыми. Состояние сеанса не работает, когда отслеживание отключено. Следующий код делает сессионные куки-файлы необходимыми:

services.AddSession(options =>
{
    options.Cookie.IsEssential = true;
});

Еще лучше, чтобы воспользоваться функцией согласия пользователя, следуйте инструкциям в той же статье.

Другой вопрос, который вы задали;

services.AddDistributedMemoryCache();  //TODO : DO I NEED IT? // Adds a default in-memory implementation of IDistributedCache
services.AddSession();

Да; Вам необходимо установить распределенный кеш, который задокументирован здесь:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-3.1

Чтобы включить промежуточное программное обеспечение сеанса, запуск должен содержать:

Любой из кэшей памяти IDistributedCache. Реализация IDistributedCache используется в качестве резервного хранилища для сеанса. Для получения дополнительной информации см. Распределенное кэширование в ASP. NET Core.

Вызов AddSession в ConfigureServices.

Вызов UseSession в Configure.

...