C# Web服务动态连接字符串单加载方法

C# Web服务动态连接字符串单加载方法,c#,.net,web-services,C#,.net,Web Services,我们有一个web服务应用程序,其数据库连接字符串硬编码在web.Config中,作为开发的临时措施 我想将其移动到一个外部(加密)文件中,但我不想在每次web服务调用时都必须读取和解密该文件,因为这样会造成速度损失 是否有一种很好的方法来读取对全局服务的第一次调用时的连接字符串,然后对该服务的后续调用可以引用它?我认为您应该衡量这是否是一个真正的性能问题(否则可能会增加不必要的复杂性) 如果确定这是一个性能问题,则可以将其存储在静态属性中,并在Application Start上的Global.

我们有一个web服务应用程序,其数据库连接字符串硬编码在web.Config中,作为开发的临时措施

我想将其移动到一个外部(加密)文件中,但我不想在每次web服务调用时都必须读取和解密该文件,因为这样会造成速度损失


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

我认为您应该衡量这是否是一个真正的性能问题(否则可能会增加不必要的复杂性)

如果确定这是一个性能问题,则可以将其存储在静态属性中,并在Application Start上的Global.asax中加载一次,然后在运行时从其他类中引用该静态属性。如果global.asax不可恢复,则可以将该属性包装在一个类中,该类从配置文件中获取connectionstring(如果尚未初始化)

一种更“正确”的方法可能是使用一些IOC容器,如Munq或Funq,并且基本上是这样做的(在应用程序启动期间从web.config加载一次,并在运行时解析)。这也将简化您的单元测试。但是如果你还没有一个,那么引入它可能有点过头了


但是,请注意:如果您解密它并将其存储在内存中,它显然将以解密的方式存储在内存中,因此内存转储将包含非encryptet连接字符串。一个解决方案是在内存中对文件进行加密,并接受解密的小开销。另一个解决办法是接受这个小的安全问题;这将取决于你的应用程序的性质。安全性总是有代价的:-)

一种标准方法是将敏感数据放入配置文件部分,并将其保存在那里。如果遇到性能问题,考虑负载平衡和水平缩放。

有没有一种好的方法来读取服务器上的连接字符串 首先调用全局服务器的服务,然后调用 服务可以参考吗


在连接对象处于活动状态之前,它是有效的。一旦对象被释放,它就消失了,在下一次连接中,CLR将再次解密敏感数据。事实上,尽快处理敏感数据是一种很好的做法。您希望将其从内存中删除,因为它可以在纯未加密状态下轻松提取,从而使整个加密无效。

谢谢,非常有用的注释。