ASP.NET сеанс веб-API или что-то еще?
Мне нужно хранить некоторую информацию в сеансе (или в любом другом ASP.NET Web API), который мне нужно получить в каждом запросе API. У нас будет один веб-сайт api IIS, и несколько Привязок веб-сайта будут добавлены через заголовок узла. Когда какой-либо запрос приходит, например, api.xyz.com, заголовок хоста будет проверен и хранить эту информацию веб-сайта в сеансе, который будет использоваться в каждом последующем запросе api при вызове базы данных.
Я знаю, что нет никакой поддержки сессии в Интернете ASP.NET API-интерфейс. Есть ли другой способ справиться с такой ситуацией? Где я могу хранить информацию, которую можно получить в каждом последующем запросе?
спасибо.
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 ядро
уже протестировано на рабочем проекте