Веб-интерфейс ASP.NET или что-то еще?

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

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

спасибо.

Ответ 1

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

Вся идея службы RESTful заключается в том, что каждый ресурс однозначно адресуется с использованием универсального синтаксиса для использования в гипермедианных ссылках, и каждый 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();

Ответ 2

в Global.asax add

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

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

сделайте снимок;)

Ответ 3

В WebApi 2 вы можете добавить это в global.asax

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

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

HttpContext.Current.Session

Ответ 4

Вы можете использовать файлы cookie, если данные достаточно малы и не представляют проблемы безопасности. Такой же подход HttpContext.Current должен работать.

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

Ответ 5

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

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

Введение в состояние сеанса и приложения в ядре ASP.NET

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