“Session ты существуешь not been configured for this application or request” в Асинхронном драйвере AspNet vNext

Привет,

Я благодарен за помощь со следующей темой, которую уже мне убивает голова. Используя AspNet vNext (1.0.0-rc1-update1) у меня были проблемы, чтобы соглашаться на данные о сеансе с драйвера для WebApi.

Случайным способом (иногда, если, иногда не), появляется эта ошибка:

“Session ты существуешь not been configured for this application or request”

adicionalmente, случается одна

“InvalidOperationException”

и объект HttpContext. Session недействительный.

Я прочитал документацию (https://docs.asp.net/en/latest/fundamentals/app-state.html) и там индийская, что, если говорится о том, чтобы соглашаться на объект “Session” перед тем, как использовать middleware “UseSession”, производит себе это исключение. Также в нескольких трэдах такого StackOverflow (английском языке) как этот: https://stackoverflow.com / questions / 29801631/unable-to-use-session-in-asp-net-vnext-project или https://stackoverflow.com / questions / 33814042/using-tempdata-is-crashing-my-application между другими; и они рекомендуют преобразовывать призывы к middlewares метода “Конфигурируйте” класса "StartUp" таким образом что middleware “UseSession” использовался перед тем, как призывать middleware “UseMvc”.

Я считаю ясной важность, которой призывы в методе Я “Конфигурировал” middlewares, будьте в строгом порядке таким образом что pipeline просьбы реагировал связным способом на middlewares и чтобы пытаться я “пересылал” названный “UseSession” и в этом моменте middleware “UseSession” это первый в методе “Конфигурируйте”, но я не добиваюсь того, чтобы это исключение продолжило происходить.

Изначально я подумал, что факт пробования использовать объект “session" с драйвера для WebApi мог бы быть зачинщиком ошибки, однако, как я прокомментировал, эта ошибка не происходит всегда а случайным способом.

Также в каких-то post StackOverflow я прочитал, что размещая один

“using Microsoft. AspNet. Http;”

что (в моем небольшом количестве знания C#) не имеет много чувства, так как “using” сам ничего не делает (кроме того, что использовались методы расширения), для случая, “using Microsoft. AspNet. Http;” нет никакого эффекта, в самом деле, у как “CodeMaid”, так и “ReSharper” они помечают эту линию как “RedundantUsingDirective”.

Как добавочное средство, чтобы пробовать заставлять функционировать мой драйвер, я попробовал использовать features Http, но эти также оказываются недействительными случайным способом. Я создал свойство, чтобы соглашаться на объект Session, я схватил:

protected ISession Session => (HttpContext.Session ?? HttpContext.Features.Get())??HttpContext.Features.Get()?.Session;

Я благодарен, если какой-либо знает, как я могу бороться с этой проблемой, который уже не позволяет мне спать.

Большое спасибо.

Обновление:

Поскольку я разместил в комментариях, я нашел, что эта одинокая ошибка появляется, когда у драйвера, где попробовал соглашаться на объект сеанс, есть асинхронные операции (Async/Await). Я изменил немного логику драйвера, чтобы оставлять это полностью синхронным (без вызовов await) и ошибка исчезает (Я думаю, что зависимость от случая, которую он говорил изначально, проистекала из доказательств, которые он делал).

Хотя я действительно не знаю, говорилось ли о вирусе, действительно мне хотелось бы вновь оставлять все асинхронным, как это у него было. Я благодарен, если кто-то знает, потому что оно функционирует, будучи синхронным и прекращает функционировать будучи асинхронным.

Спасибо снова.

3
задан 23.05.2017, 15:39
1 ответ

Чтобы использовать сеанс в проекте ASP.NET Core (a.k.a ASPNET vNext, a.k.a ASPNET5) нужно добавлять ссылку Microsoft.AspNet.Session

После нужно конфигурировать использование сеансов в pipeline OWIN добавляя вызовы в AddSession() и AddCaching() в методе ConfigureServices(IServiceCollection services) файла startup.cs

// Add MVC services to the services container.
services.AddMvc();
services.AddCaching(); // Adds a default in-memory implementation of     IDistributedCache
services.AddSession();

В конце концов, нужно добавлять вызов в UseSession() непосредственно перед конфигурировали маршруты Mvc

// IMPORTANT: This session call MUST go before UseMvc()
app.UseSession();

// Add MVC to the request pipeline.
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller}/{action}/{id?}",
        defaults: new { controller = "Home", action = "Index" });

    // Uncomment the following line to add a route for porting Web API 2 controllers.
    // routes.MapWebApiRoute("DefaultApi", "api/{controller}/{id?}");
});

Таким образом уже ты сможешь использовать сеанс в твоих драйверах

public class HomeController : Controller
{
    public IActionResult Index()
    { 
        HttpContext.Session.SetString("Test", "Ben Rules!");
        return View();
    }

    public IActionResult About()
    {
        ViewBag.Message = HttpContext.Session.GetString("Test");

        return View();
    }
}

Заметь: Я получил примеры кода от этой статьи на английском, где они это объясняют подробной формы, но у меня не было время тестирования этого лично. Уже ты расскажешь, ты функционирует ли оно.

Обновление: Также возможно соглашаться на стоимость переменных сеанса с асинхронного задания используя async/await

public async Task<IActionResult> About()
{
    var task = new Task<string>(() => {
        var count = HttpContext.Session.GetInt32("Contador");

        if (count.HasValue)
            count++;
        else
            count = 1;

        HttpContext.Session.SetInt32("Contador", count.Value);
        return $"Mensaje desde tarea asíncrona [{count}]";
    });
    task.Start();

    ViewData["Message"] = await task;
    return View();
}
5
ответ дан 24.11.2019, 14:45
  • 1
    Большое спасибо @rsciriano, Если, segu и # 237; gu и # 237; в такой который, поскольку они упоминают о ней в ссылке, которую ты имеешь и в других, но оно не функционирует. Но кажись, что уже encontr и # 233; что-то из света в проблеме и, как кажется, одинокая проблема случается, когда пробует соглашаться на объект Session с драйвера с операциями, схвати и # 237; ncronas (async / await). Remov и # 237; все операции схвати и # 237; ncronas, где он использовал объект sesssion и convert и # 237; в операциях s и # 237; ncronas и уже функционируй хорошо. Я нравиться и # 237; чтобы менять вопрос (t и # 237; tulo), но не s и # 233; если он был подходящим. Не s и # 233; если было нужно удалять esta†¦ и создавать другую. – Camilo Bernal 09.03.2016, 19:13
  • 2
    @CamiloBernal ничего. Как только это вопроса, quiz и # 225; s лучшее состояло в том, чтобы ты издал ее, хотя ты изменишь ее полностью. О моем ответе не беспокойся о том, что его почти было один copy/paste+traducci и # 243; n этого art и # 237; зад, который имей, и # 237; в в руку, потому что я готовлю мастерскую для следующего вторника в EINA Unizar . Когда у тебя будет новый вопрос ты пробовать и # 233; отвечать. Привет – rsciriano 09.03.2016, 19:41