Как передать хрупкие данные, например, строку подключения от одного контроллера к другому - PullRequest
0 голосов
/ 24 февраля 2019

Я новичок в ядре asp.net, и я пытался разработать онлайн-менеджер баз данных SQL, который будет работать с любой базой данных SQL после прохождения: ServerAddress, Login, Password и DatabaseType (моя модель ConnectionInformation).

Что-то вроде SSMS, но в сети.

Я хочу передать свою модель ConnectionInformation из контроллера входа в контроллер базы данных.

Для перенаправления в действие используется строка запроса, которая предоставляет все мои данные,TempData принимает только строки, и преобразование моей модели в json - не самый элегантный способ решения этой проблемы.

Контроллер входа:

public class LoginController : Controller
{
    private readonly ILoginLogic _loginLogic;

    public LoginController(ILoginLogic loginLogic)
    {
        _loginLogic = loginLogic;
    }

    [HttpGet]
    public IActionResult Index()
    {
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Index(ConnectionInformationViewModel connectionViewModel)
    {
        if (!ModelState.IsValid)
            return View();

        ConnectionInformation connection = Mapper.Mapper.ConnectionInformationMapper(connectionViewModel);

        var connectionSuccess = _loginLogic.ConnectToDatabase(connection);

        if (connectionSuccess)
            return RedirectToAction("Index", "Database", connection);
        else
            return View(); // TODO: Return view with error or handle it in js
    }
}

Контроллер базы данных:

 public class DatabaseController : Controller
    {
        private readonly IDatabaseLogic _databaseLogic;

        public DatabaseController(IDatabaseLogic databaseLogic)
        {
            _databaseLogic = databaseLogic;
        }

        public IActionResult Index(ConnectionInformation connection)
        {
            var databases = _databaseLogic.GetDatabases(connection);
            return View(databases);
        }
    }

Возможно, мой подход совершенно неверен.Моя главная цель - проверить, могу ли я подключиться к базе данных, и если я могу, я хочу выполнять операции с запросами к этой базе данных, пока пользователь не выйдет из системы.

1 Ответ

0 голосов
/ 25 февраля 2019

Ну, просто, вам нужно как-то сохранять информацию.В связи с этим есть ряд вариантов.Вы можете сохранить его в локальном хранилище на клиенте и фактически передавать его при каждом последующем запросе.Это работает лучше для приложений в стиле SPA, где вы в значительной степени делаете все через AJAX.Другим технически клиентским механизмом хранения будет установка файла cookie сеанса с опубликованной информацией о соединении.Здесь я говорю о явной установке и чтении из cookie с временем жизни «сеанса», без использования сессий.

Или вы можете использовать настоящий сеанс, то есть Session.В любом случае, TempData - это просто Session, но здесь это было бы неуместно, так как вам нужно было бы обеспечить, чтобы TempData хранился каждый раз, когда к нему обращаются, или он не выдержит следующего запроса.Если вы делаете это, то вы можете просто использовать Session и не беспокоиться об этом.

Сериализация в значительной степени требуется независимо от того, что вы делаете.Нет никакого способа сохранить фактический экземпляр объекта C #, поэтому вам нужно будет либо записать его в реляционное хранилище, например, в базу данных, либо сериализовать его в JSON.

Одно альтернативное решение, которое не требует сохраненияФактическая информация о соединении заключается в создании собственного пула соединений.Для этого потребуется класс с одноэлементной областью действия с ConcurrentDictionary иваром и, вероятно, использование SemaphoreSlim для блокировки во время чтения и записи этого словаря, чтобы вы не создавали и не теряли связи.Затем вам просто нужно как-то назначить ключ для их конкретного соединения в клиенте словаря, например, через Session или cookie.Это на самом деле немного более безопасно, так как вы не сохраняете информацию о подключении к базе данных после первоначальной публикации, но вы можете закончить тем, что исчерпали доступные подключения к серверу, если слишком много одновременных пользователей.Конечно, это может быть проблемой, независимо от.Вам также понадобится некоторая политика для удаления соединений.Это не самая простая настройка.

Лично я бы просто использовал Session на этом.Это достаточно безопасно, пока вы принимаете стандартные меры по предотвращению угона сеанса, и его легко внедрить.Если вы создаете приложение в стиле SPA, то я бы придерживался локального хранилища, так как с самого начала будет лучше сохранять информацию на стороне клиента, но в этом случае требуется немного больше возможностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...