我是 asp.net core 的新手,我试图开发一个在线 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);
}
}
Prehaps 我的方法是完全错误的。我的主要目标是检查我是否可以连接到数据库,如果可以,我想对该数据库执行查询操作,直到用户注销。
嗯,简单地说,您必须以某种方式保留信息。在这方面,有多种选择。您可以将它保存在客户端的本地存储中,并在每个进一步的请求中实际将其传回。不过,这对于 SPA 风格的应用程序效果更好,因为您几乎可以通过 AJAX 完成所有操作。另一种技术上的客户端存储机制是使用发布的连接信息设置会话 cookie。在这里,我谈论的是显式设置和读取具有“会话”生命周期的 cookie,而不是使用会话。
或者您实际上可以使用真正的会话,即Session
. TempData
基本上只是Session
无论如何,但在这里它是不合适的,因为您需要确保TempData
每次访问时都保留它,否则它不会在下一个请求中幸存下来。如果您正在这样做,那么您不妨直接使用Session
而不必担心。
无论您做什么,都非常需要序列化。无法持久保存实际的 C# 对象实例,因此您必须将其写入关系存储(如数据库)或将其序列化为 JSON。
一种避免必须保留实际连接信息的替代解决方案是基本上创建您自己的连接池。这将需要一个带有ConcurrentDictionary
ivar的单例范围的类,并且可能SemaphoreSlim
在读取和写入该字典期间使用锁定,这样您就不会创建和孤立连接。然后,您只需要以某种方式将密钥分配给字典客户端中的特定连接,例如通过Session
或饼干。这实际上也更安全一些,因为您不会在初始帖子之后保留数据库连接信息,但是如果同时使用的用户太多,您最终可能会耗尽可用的服务器连接。当然,无论如何这都可能是一个问题。您还需要一些用于驱逐连接的策略。这不是最简单的设置。
就个人而言,我只是坚持使用Session
这个。它足够安全,只要你采取标准的会话劫持预防措施,并且实施起来很简单。如果您正在构建一个 SPA 风格的应用程序,那么我会坚持使用本地存储,因为这将立即更好地保持信息客户端开始,但它需要更多的管道。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句