如何将易碎数据(例如连接字符串)从一个控制器传递到另一个

时间:2019-02-24 19:21:50

标签: c# sql ado.net asp.net-core-mvc

我是asp.net核心的新手,我试图开发一个在线SQL数据库管理器,该管理器在传递以下内容后可以在任何SQL数据库上运行:ServerAddress,Login,Password和DatabaseType(我的ConnectionInformation模型)。

类似SSMS的但在线的。

我想将ConnectionInformation模型从Login控制器传递到Database控制器。

重定向到操作使用查询字符串,该字符串公开了我的所有数据。 TempData仅接受字符串,将我的模型转换为json并不是解决此问题的最优雅的方法。

登录控制器:

elif event.key == K_DOWN:
        y += 25

数据库控制器:

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
    }
}

也许我的方法是完全错误的。我的主要目标是检查是否可以连接到数据库,以及是否要对该数据库执行查询操作,直到用户注销为止。

1 个答案:

答案 0 :(得分:1)

简单来说,您必须以某种方式保留信息。在这方面,有很多选择。您可以将其持久保存在客户端的本地存储中,并在每次其他请求时将其实际传递回去。这对于SPA风格的应用程序效果更好,不过您几乎可以通过AJAX进行所有操作。从技术上讲,另一种客户端存储机制是使用发布的连接信息设置会话cookie。在这里,我谈论的是显式设置和读取具有“会话”生存期的cookie,而不使用会话。

或者您可以实际使用真实会话,即SessionTempData基本上只是Session,但在这里这样做是不合适的,因为您随后需要确保每次访问TempData时都将其保留,否则下一次将无法生存请求。如果您正在这样做,那么不妨使用Session而不用担心。

无论您做什么,都非常需要串行化。无法持久存储实际的C#对象实例,因此您要么必须将其写入数据库等关系存储中,要么将其序列化为JSON。

一个替代的解决方案是基本上创建您自己的连接池,从而避免了必须保留实际的连接信息。这将需要一个具有ConcurrentDictionary ivar的单例作用域类,并且可能在该字典的读写期间使用SemaphoreSlim进行锁定,这样就不会创建或孤立连接。然后,您只需要以某种方式将密钥分配给字典客户端中的特定连接,例如通过Session或cookie。实际上,这也更安全一些,因为您不会在最初的发布之后就保留数据库连接信息,但是如果同时有太多用户,您可能最终会耗尽可用的服务器连接。当然,无论如何,这都可能是一个问题。您还需要一些用于收回连接的策略。这不是最简单的设置。

就我个人而言,我只会坚持使用Session。只要您采取标准的防止会话劫持措施,它就足够安全,并且易于实施。如果您要构建SPA风格的应用程序,那么我会坚持使用本地存储,因为从一开始就保持信息客户端将是更好的选择,但这需要更多的方法。