【问题标题】:How to connect to SQL Server from C# app through HTTP?如何通过 HTTP 从 C# 应用程序连接到 SQL Server?
【发布时间】:2014-01-14 15:30:19
【问题描述】:

我们有一个旧版 WinForms 应用程序(由其他人编写),它直接使用 ADO.NET(.NET 2.0,C#)连接到 SQL Server。我们想教这个应用程序与很远的 SQL Server 通信(不在应用程序工作的同一个 LAN 中)。

我想到的第一个想法是按照与 SSL Explorer (http://sourceforge.net/projects/sslexplorer/) 相同的方式进行操作:创建隧道(仍然不知道如何)并将 ADO.NET 连接字符串更改为 127.0 .0.1:34761(某个端口),并且为了让 .NET 应用程序连接到本地端口,认为这是 SQL Server 实例,我们的代码将以某种方式将此流量重定向到我们的 Web 服务(接近真正的 SQL服务器是),我们的 Web 服务连接到真正的 SQL Server。

所以,总的来说,接下来的目标是:在不修改 C# 应用程序的所有代码的情况下,在 Main() 方法的开头添加一些行(用于初始化隧道),并开发一个 ASP.NET Web 服务获取所有数据包并转发到真实 SQL Server 实例。

问题:有人知道怎么做这样的“隧道”吗?
也许有人知道是否有一些工作样本?

【问题讨论】:

  • 在两个站点之间设置VPN
  • 这就是人们开始开发 WCF/WebAPI 应用程序的原因。编码到服务,而不是 RDBMS。祝你好运。

标签: c# asp.net sql .net sql-server


【解决方案1】:

如果你不想改变你的 C# 代码,你基本上有以下选择:

  • 创建 VPN(例如使用 PPTP、IPSec 或 OpenVPN)。这是最安全的选择。

  • 配置 SQL Server 的防火墙以允许从客户端的 IP 访问 SQL Server 的端口。这是最不安全的选项。

  • 在与 SQL Server 相同的网络中安装终端服务器并在那里运行您的应用程序。

曾经有一个通过 HTTP 连接到 SQL Server 的选项,但该功能是 has been deprecated with SQL Server 2008removed with SQL Server 2012。但即使它仍然可用,我认为它不会允许直接 OLEDB 或 SqlClient 连接。

【讨论】:

    【解决方案2】:

    您可以使用某种 VPN 连接,或者建立到您的服务器的 SSH 隧道(我个人建议将 http://www.bitvise.com 作为服务器端选项)。请注意以下几点:

    1. 如果您的应用程序应该负责建立连接,SSH 隧道会更容易。但是在任何一种情况下,你的应用程序和它运行的环境之间都会出现某种依赖关系。它不仅需要知道 SQL 服务器的 IP 是什么,还需要知道如何建立底层连接(服务器、端口、用户名、密码/密钥、协议等)。这使您的应用程序更容易出现由环境变化引起的错误。考虑通过将连接维护留给管理目的来摆脱这种依赖关系。与本地服务器不可用时没有应用程序尝试配置网络接口的方式相同 - 它只是报告连接错误。

    2. WAN 连接(公共或隧道连接)更容易出现运行时连接失败。很少有应用程序代码以这样的方式编写,即一旦成功建立连接,就可以在任何随机时刻断开连接。通过使用事务或在远程存储过程中收集代码,确保应用程序代码意识到这种可能性。

    3. 作为代表您的应用程序执行 SQL 操作的某种 Web 服务,这应该相对容易实现(可能归结为执行查询并返回行或数或受影响的行的单个 SOAP 操作)。问题是,如果您的应用程序中的所有数据库操作都可以轻松地替换为 SOAP/远程操作。此外 - 还有一些新问题需要考虑(例如安全问题或操作的原子性 - 即必须确保没有执行两次查询)。

    【讨论】:

    • 亲爱的大家,非常感谢您的所有帖子。我知道这是制作 SSH 的可能性,问题是“如何使用 C# 以编程方式建立 SSH 连接?”。换句话说,“如何在我们的应用程序中编写 SSH?”。
    • 我想解释点别的。 1) VPN 不是一种选择。 2)更改此应用程序的代码也不是一种选择(解释原因很长)。当然,理论上,我们可以获取代码,在其中添加一些与我们的 Web 服务通信的额外级别,并教 GUI 从那些类而不是直接连接中获取数据。理论上。但这是一个巨大的代码 - 这是一个很长的路要走。我们不会这样做。 3)打开直接端口到该 SQL 服务器也不是一个选项
    • 似乎我找到了一些东西 - sshnet.codeplex.com。问题是这是否是我们需要的东西?我们能否在这个库的帮助下在 Main() 方法中进行多次调用来初始化隧道,并创建一个 Web 服务器来接受来自我们应用程序的 http 流量并将其转换为 tcp/ip 流量到我们的 SQL Server?
    猜你喜欢
    • 1970-01-01
    • 2019-11-21
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多