Получение и сохранение состояния по запросам
Я пишу свое первое приложение веб-API ASP.NET. Я знаком с другими структурами веб-приложений (в основном Symfony, но также Django и, в меньшей степени, RoR).
Я немного борюсь, чтобы понять последовательность событий, которые происходят после того, как запрос отправлен от браузера/переднего клиента к веб-серверу.
Я пишу многозадачное приложение, которое использует бэкэнд БД. Я использую ADO и raw SQL для доступа к базе данных, мне также нужно хранить много информации для каждого пользователя, так что в основном я создаю (или извлекаю из кеша) предварительно загруженный контекст для пользователя.
вот какой-то псевдокод, который иллюстрирует, чего я пытаюсь достичь, в ASP.NET.
namespace myApp.Controllers
{
public class FoobarController : ApiController
{
public Response doLogin(request)
{
var ctx = myApplicationContext.getInstance();
var user = ctx.getUser();
if (!user.isLoggedOn())
{
username = request.getParameter('username');
password= request.getParameter('password');
dbManager = ctx.getDbInstance();
resp = dbManager.internalLogin(username, password);
// Load permissions etc for current user, from db
// Store user info in cache ..
}
}
public Response ActionOne(request)
{
ctx = myApplicationContext.getInstance();
user = ctx.getUser();
if (user.hasPermission('xxx'))
{
}
}
}
}
Мой вопрос: как реализовать такую функциональность:
А именно:
-
Создайте контекст приложения, в котором я могу заполнить контекстно-зависимую информацию, такую как соединение с базой данных, конфигурацию почтовой программы, объекты-объекты, информацию о разных состояниях и т.д.
-
Доступ к пользовательскому объекту (который я могу добавить учетные данные пользователя, разрешения и т.д.)
-
Есть ли доступ к переменным сеанса и т.д.
Примечания
- Я буду развертывать веб-приложение в Linux, и я буду использовать Apache в качестве веб-сервера.
- Для целей этого проекта я не хочу использовать какие-либо технологии Microsoft, такие как Azure, Windows Authentication и т.д. (кроме С# и ASP.Net).
- Я хочу использовать необработанное соединение с базой данных, не используя Entity Manager (старый порт приложения)
Ответы
Ответ 1
Я немного борюсь, чтобы понять последовательность событий, которые происходят после того, как запрос отправлен от браузера/переднего клиента к веб-серверу.
Для этого я бы сказал этот PDF-плакат дает наилучшее графическое представление обработки запросов в ASP.NET WebAPI.
Мой вопрос: как реализовать такую функциональность:
А именно:
-
Создайте контекст приложения, в котором я могу заполнить контекст такая как соединение с базой данных, почтовая программа конфигурации, объектных заводов, информации о разных состояниях и т.д.
-
Доступ к пользовательскому объекту (который я могу добавить учетные данные пользователя, разрешения и т.д.)
-
Есть ли доступ к переменным сеанса и т.д.
Для этого я бы сказал, что WebAPIs предназначены для безгражданства, поэтому наилучшим подходом является создание постоянного сеанса (Say in database) и использование идентификатора для сеанса (например, сеансового ключа или токена) для каждого запроса для идентификации пользователя и получить его переменные сеанса/контекстную информацию.
Теперь, для реализации той функции, которую вы попросили в своем примере, это будет достигнуто комбинацией фильтров аутентификации и фильтров авторизации (Подробнее подробности об их реализации здесь).
Каждый запрос в WebAPI сначала обрабатывается обработчиками, а затем перед выполнением запрошенного действия применяются фильтры. В вашем примере фильтры проверки подлинности будут содержать функцию DoLogin
, а логика user.hasPermission
будет находиться в фильтрах авторизации, и только логика действий будет находиться в действии (функции) в контроллере.
![введите описание изображения здесь]()