我们有一个传统的WinForms应用程序(由其他人编写),它使用ADO.NET(.NET 2.0,C#)直接连接到SQL Server。我们希望教这个应用程序与远在远处的SQL Server(不在应用程序工作的同一局域网中)进行通信。
我想到的第一个想法就是以与SSL Explorer(http://sourceforge.net/projects/sslexplorer/)相同的方式工作:创建隧道(仍然不知道如何)并更改ADO.NET连接字符串到127.0.0.1:34761(某个端口),为了使.NET应用程序连接到本地端口,认为这是SQL Server实例,我们的代码将以某种方式将此流量重定向到我们的Web服务(即接近真正的SQL Server是),我们的Web服务连接到真正的SQL Server。
因此,通常目标是下一步:不修改C#应用程序的所有代码,在Main()方法的开头添加一些行(初始化隧道),并开发一个ASP.NET Web服务,获取所有数据包和转发到真正的SQL Server实例。
问题:有谁知道如何制作这样的“隧道”? 也许有人知道是否有一些工作样品?
答案 0 :(得分:2)
如果您不想更改C#代码,则基本上有以下选项:
创建VPN(例如使用PPTP,IPSec或OpenVPN)。这是最安全的选择。
配置SQL Server的防火墙,以允许从客户端的IP访问SQL Server的端口。这是最不安全的选择。
在与SQL Server相同的网络中安装终端服务器并在那里运行您的应用程序。
曾经有一个通过HTTP连接到SQL Server的选项,但该功能has been deprecated with SQL Server 2008和removed with SQL Server 2012。但即使它仍然可用,我认为它不允许直接的OLEDB或SqlClient连接。
答案 1 :(得分:0)
您可以使用某种VPN连接,也可以建立到服务器的SSH隧道(我个人建议http://www.bitvise.com作为服务器端选项)。请考虑以下因素:
如果您的应用程序应负责建立连接,SSH隧道将更容易。但无论哪种情况,您的应用程序与其运行的环境之间都会出现某种依赖关系。它不仅需要知道什么是SQL服务器的IP,还需要知道如何建立底层连接(服务器,端口,用户名,密码/密钥,协议等)。这使您的应用程序更容易因环境变化而导致错误。考虑通过将连接维护留给管理目的来消除这种依赖性。与本地服务器不可用时没有应用程序尝试配置网络接口的方式相同 - 它只是报告连接错误。
WAN连接(公共连接或隧道连接)更容易出现运行时连接故障。很少应用程序代码的编写方式是,一旦成功建立连接,就可以在任何随机时刻丢弃。通过使用事务或在远程存储过程中收集代码,确保应用程序代码知道这种可能性。
对于某些代表您的应用程序执行SQL操作的Web服务,这应该相对容易实现(可能归结为单个SOAP操作执行查询并返回受影响的行或数字或行)。问题是,如果应用程序中的所有数据库操作都可以轻松地用SOAP /远程操作替换。此外 - 应该考虑新的问题(例如安全问题或操作的原子性 - 即必须确保不执行任何查询两次)。