我是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
}
}
也许我的方法是完全错误的。我的主要目标是检查是否可以连接到数据库,以及是否要对该数据库执行查询操作,直到用户注销为止。
答案 0 :(得分:1)
简单来说,您必须以某种方式保留信息。在这方面,有很多选择。您可以将其持久保存在客户端的本地存储中,并在每次其他请求时将其实际传递回去。这对于SPA风格的应用程序效果更好,不过您几乎可以通过AJAX进行所有操作。从技术上讲,另一种客户端存储机制是使用发布的连接信息设置会话cookie。在这里,我谈论的是显式设置和读取具有“会话”生存期的cookie,而不使用会话。
或者您可以实际使用真实会话,即Session
。 TempData
基本上只是Session
,但在这里这样做是不合适的,因为您随后需要确保每次访问TempData
时都将其保留,否则下一次将无法生存请求。如果您正在这样做,那么不妨使用Session
而不用担心。
无论您做什么,都非常需要串行化。无法持久存储实际的C#对象实例,因此您要么必须将其写入数据库等关系存储中,要么将其序列化为JSON。
一个替代的解决方案是基本上创建您自己的连接池,从而避免了必须保留实际的连接信息。这将需要一个具有ConcurrentDictionary
ivar的单例作用域类,并且可能在该字典的读写期间使用SemaphoreSlim
进行锁定,这样就不会创建或孤立连接。然后,您只需要以某种方式将密钥分配给字典客户端中的特定连接,例如通过Session
或cookie。实际上,这也更安全一些,因为您不会在最初的发布之后就保留数据库连接信息,但是如果同时有太多用户,您可能最终会耗尽可用的服务器连接。当然,无论如何,这都可能是一个问题。您还需要一些用于收回连接的策略。这不是最简单的设置。
就我个人而言,我只会坚持使用Session
。只要您采取标准的防止会话劫持措施,它就足够安全,并且易于实施。如果您要构建SPA风格的应用程序,那么我会坚持使用本地存储,因为从一开始就保持信息客户端将是更好的选择,但这需要更多的方法。