2011-08-09 29 views
1

我们有一个Web服务应用程序,其数据库连接字符串被硬编码在Web.Config中作为开发的临时措施。Web服务动态连接字符串单一加载方法

我想将其移入外部(加密)文件,但我不希望在每次Web服务调用时都必须读取和解密此文件,否则会有速度损失。

有没有一种很好的方法来读取第一次调用服务时的连接字符串到全局,然后对服务的后续调用可以引用它?

回答

0

我认为你应该做一个测试这是一个真正的性能问题(否则你可能会增加不必要的复杂性)。

如果您确定这是一个性能问题,您可以将其存储在静态属性中,并在Global.asax中加载一次OnApplicationStart,并在运行时引用其他类的静态属性。如果global.asax是不可信的,你可以将该属性包装在一个类中,该类从您的配置文件中获取连接字符串(如果尚未初始化)。

一个更“正确”的方法可能是使用一些像Munq或Funq这样的IOC容器,并且几乎可以做同样的事情(在应用程序启动时从web.config加载一次并在运行时解析它)。这也很容易进行你的单元测试。但是如果你还没有一个,引入它可能是矫枉过正的。

但是,请注意:如果您解密并将其存储在内存中,它显然会以解密的方式存储在内存中,因此内存转储将包含非加密连接字符串。一个解决方案可能是保持文件在内存中的加密并接受解密该文件的小额开销。另一种解决方案可能是接受这个小问题;这取决于你的应用程序的性质。安全始终有一个成本:-)

+0

谢谢,非常有用的意见。 – Mattl

0

一个标准的方法是将敏感数据放入配置文件部分和encrypt/decrypt它那里。如果您遇到性能问题,请考虑负载平衡和水平缩放。

是否有用于读取连接字符串的 首次调用服务的全球再后续调用 服务可以参考它的好方法吗?

直到连接对象处于活动状态才有效。一旦对象被丢弃 - 它就消失了,下一次连接CLR将再次解密敏感数据。事实上,尽快处理敏感数据是一种很好的做法。你想从内存中删除它,因为它可以很容易地以纯粹的未加密状态提取,这反过来使整个加密无用。