Доступ к текущему HttpContext в ASP.NET Core с помощью Custom - PullRequest
0 голосов
/ 21 марта 2019

Я пишу код для следующего: Доступ к текущему HttpContext в ASP.NET Core

Я получаю ошибку.Как бы я решить это?Кроме того, что код для интерфейса IMyComponent?Просто хочу убедиться, что это правильно.

Ошибки:

Тип или пространство имен IMyComponent Не удается найти Имя 'KEY' не существует в текущем контексте.

public class MyComponent : IMyComponent
{
    private readonly IHttpContextAccessor _contextAccessor;

    public MyComponent(IHttpContextAccessor contextAccessor)
    {
        _contextAccessor = contextAccessor;
    }

    public string GetDataFromSession()
    {
        return _contextAccessor.HttpContext.Session.GetString(*KEY*);
    }
}

1 Ответ

0 голосов
/ 21 марта 2019

Некоторые моменты, на которые нужно обратить внимание:

1.Вы наследуете класс от интерфейса и реализуете метод GetDataFromSession. Сначала необходимо определить интерфейс IMyComponent и зарегистрировать IMyComponent в staryup, если вы хотите использовать DI

public interface IMyComponent
{
    string GetDataFromSession();
}

startup.cs

services.AddSingleton<IMyComponent, MyComponent>();

2. Похоже, вы хотели бы получить данные из сессии. «Ключ» представляет любое имя сеанса (строку). Вам необходимо включить сеанс для ядра asp.net и сначала установить значение сеанса.

_contextAccessor.HttpContext.Session.SetString("Key", "value");

3.Регистрация IHttpContextAccessor при запуске

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

4.Полная демонстрация:

MyComponent.cs

public class MyComponent : IMyComponent
{
    private readonly IHttpContextAccessor _contextAccessor;

    public MyComponent(IHttpContextAccessor contextAccessor)
    {
        _contextAccessor = contextAccessor;
    }

    public string GetDataFromSession()
    {

        _contextAccessor.HttpContext.Session.SetString("Key", "value");
        return _contextAccessor.HttpContext.Session.GetString("Key");
    }
}

public interface IMyComponent
{
    string GetDataFromSession();
}

Startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDistributedMemoryCache();

        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.Cookie.HttpOnly = true;
            // Make the session cookie essential
            options.Cookie.IsEssential = true;
        });


        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddScoped<IMyComponent, MyComponent>();
    }


    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        //other middlewares
        app.UseSession();           
        app.UseMvc();
    }
}

API-контроллер:

public class ForumsController : ControllerBase
{
    private readonly IMyComponent _myComponent;

    public ForumsController(IMyComponent myComponent)
    { 
        _myComponent = myComponent;
    }
    // GET api/forums
    [HttpGet]
    public ActionResult<string> Get()
    {
        var data = _myComponent.GetDataFromSession();//call method and return "value"
        return data;

    }
...