ASP.NET сеанс веб-API или что-то еще?


Мне нужно хранить некоторую информацию в сеансе (или в любом другом ASP.NET Web API), который мне нужно получить в каждом запросе API. У нас будет один веб-сайт api IIS, и несколько Привязок веб-сайта будут добавлены через заголовок узла. Когда какой-либо запрос приходит, например, api.xyz.com, заголовок хоста будет проверен и хранить эту информацию веб-сайта в сеансе, который будет использоваться в каждом последующем запросе api при вызове базы данных.

Я знаю, что нет никакой поддержки сессии в Интернете ASP.NET API-интерфейс. Есть ли другой способ справиться с такой ситуацией? Где я могу хранить информацию, которую можно получить в каждом последующем запросе?

спасибо.

5 53

5 ответов:

Ну, отдых по дизайну-это апатриды. Добавляя сеанс (или что-то еще в этом роде), вы делаете его статусным и побеждаете любую цель иметь RESTful API.

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

поэтому все, что вы пытаетесь сделать с веб-API здесь, скорее всего, должно быть переархитектурировано, если вы хотите иметь RESTful API.

С учетом сказанного, если вы все еще готовы пойти по этому маршруту, есть хакерский способ добавления сеанса в веб-API, и он был опубликован Imran здесь http://forums.asp.net/t/1780385.aspx/1

код (хотя я не рекомендую):

public class MyHttpControllerHandler
  : HttpControllerHandler, IRequiresSessionState
{
    public MyHttpControllerHandler(RouteData routeData): base(routeData)
    { }
}

public class MyHttpControllerRouteHandler : HttpControllerRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new MyHttpControllerHandler(requestContext.RouteData);
    }
}

public class ValuesController : ApiController
{
   public string GET(string input)
   {
       var session = HttpContext.Current.Session;
       if (session != null)
       {
           if (session["Time"] == null)
           {
               session["Time"] = DateTime.Now;
           }
           return "Session Time: " + session["Time"] + input;
       }
       return "Session is not availabe" + input;
    }
}

а затем добавить HttpControllerHandler для вашего маршрута API:

route.RouteHandler = new MyHttpControllerRouteHandler();

в глобальном.эйсакс добавить

public override void Init()
{
    this.PostAuthenticateRequest += MvcApplication_PostAuthenticateRequest;
    base.Init();
}

void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
{
    System.Web.HttpContext.Current.SetSessionStateBehavior(
        SessionStateBehavior.Required);
}

дать ему шанс ;)

в WebApi 2 Вы можете добавить это в глобальные.асакс

protected void Application_PostAuthorizeRequest() 
{
    System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}

затем вы можете получить доступ к сессии через:

HttpContext.Current.Session

вы можете использовать куки, если данные достаточно малы, и не представляет угрозу безопасности. Тот же HttpContext.Нынешний подход должен работать.

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

теперь в 2017 году с ASP.Net ядро вы можете сделать это, как описано здесь.

Microsoft.AspNetCore.Пакет сеанса предоставляет промежуточное программное обеспечение для управления состоянием сеанса.

Автозагрузка.cs

public void ConfigureServices(IServiceCollection services)
{
  // Adds a default in-memory implementation of IDistributedCache.
    services.AddDistributedMemoryCache();

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

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

документы: введение в состояние сеанса и приложения в ASP.NET ядро

уже протестировано на рабочем проекте