我们有一个Web服务应用程序,其中Web.Config中的数据库连接字符串是硬编码的,作为开发的临时措施。
我想将其转移到外部(加密)文件中,但我不希望必须在每次Web服务调用时读取和解密此文件,因为速度会受到惩罚。
有没有一种很好的方法可以在第一次调用服务时读取连接字符串到全局,然后对服务的后续调用可以引用它?
答案 0 :(得分:0)
我认为你应该对它进行测量,这是一个真正的性能问题(否则你可能会增加不必要的复杂性)。
如果您确定这是性能问题,可以将其存储在静态属性中并在Global.asax OnApplicationStart中加载一次,并在运行时从其他类引用静态属性。如果global.asax是不可能的,你可以将该属性包装在一个类中,该类从配置文件中获取连接字符串(如果尚未初始化)。
更“正确”的方法可能是使用一些IOC容器,如Munq或Funq,并且几乎一样(在应用程序启动期间从web.config加载一次并在运行时解析)。这也很容易进行单元测试。但是如果你还没有,那么引入它可能有点过头了。
但是,请注意:如果您将其解密并将其存储在内存中,它显然会以解密的方式存储在内存中,因此内存转储将包括非加密连接字符串。解决方案可以是将文件加密到内存中并接受解密它的微小开销。另一个解决方案可能是接受这个小的安全问题;这取决于你的应用程序的性质。安全总是有成本: - )
答案 1 :(得分:0)
标准方法是将敏感数据放入配置文件部分,并将encrypt/decrypt放在那里。如果遇到性能问题,请考虑负载平衡和水平扩展。
是否有一种很好的方法来读取连接字符串 首先调用服务到全局然后再调用 服务可以参考吗?
在连接对象处于活动状态之前有效。一旦对象被丢弃 - 它就消失了,在下一次连接时,CLR将再次解密敏感数据。事实上,尽快处理敏感数据是一种好习惯。您希望将其从内存中删除,因为它可以在纯粹的未加密状态下轻松提取,从而使整个加密无效。