1

我有一个复杂的问题,我不确定是什么原因造成的。简而言之,我几乎可以测试我需要的任何东西,但我不确定在我的场景中解决数据库连接字符串问题的最佳方法。

我的开发环境与我的测试环境有很大不同。我的测试环境在 DMZ 中。我的开发环境与数据库服务器在同一个域内。

在我的开发环境中,我在桌面上运行并使用连接字符串进行连接并使用受信任的连接。

在 DMZ 中,我已将文件部署在 IIS 7 指向同一服务器的系统驱动器上。因为测试环境在 DMZ 上,所以我使用服务器的 IP 地址和必须在连接字符串中指定的特殊端口号。

我的 Web 应用程序不包含连接字符串。我将连接字符串保存在 .cs 文件中,并基于 .Net 中的 Evironment.machineName 变量,应用程序在运行时决定使用哪个连接字符串并将其存储到全局静态变量中,所以我基本上有:

public static readonly string strDBConnDev = "connection stuff here";
public static readonly String strDBConnTest = "connection stuff here";

public static String strDBConn;

然后我有一个在运行的页面加载时触发的函数

public static void setEnvVars()
{

// This is psuedocode

if(environment.machinename = "mydevmachine")

{       
strDBConn = strDBConnDev;
        }

        if(environment.machinename = "mytestmachine")
        {
            strDBConn = strDBConnTest;
        }
}

我在 dev 上建立了成功的连接。连接字符串或有关它的某些内容不正确。我正在使用 .Net 数据提供程序,使用 System.Data.SqlClient。我继续使用它很重要。我没有在 IIS 7 数据库部分配置任何连接字符串,因为在我们的其他环境中似乎不需要。

根据我发现的一篇文章:有两种格式。我的开发机器使用的那个

// .NET DataProvider -- 可信连接

使用 System.Data.SqlClient;

SqlConnection conn = new SqlConnection();
conn.ConnectionString =
"Data Source=ServerName;" +
"Initial Catalog=DataBaseName;" +
"Integrated Security=SSPI;";
conn.Open();

以及我需要在 dmz 中进行测试才能使用的通过 ip 的连接:

// .NET DataProvider -- 通过 IP 地址

using System.Data.SqlClient;

SqlConnection conn = new SqlConnection();
conn.ConnectionString =
"Network Library=DBMSSOCN;" +
"Data Source=xxx.xxx.xxx.xxx,[port number];" +
"Initial Catalog=DataBaseName;" +
"User Id=UserName;" +
"Password=Secret;";
conn.Open();

我的难题是我遇到了麻烦,以至于我知道在 DMZ 中设置了连接字符串变量。但是我的连接失败,但我没有收到错误。它只是悄悄地失败了。我检查了 DMZ 上的 IIS 日志,没有发现任何线索或提示的证据。我还检查了 Windows 应用程序日志,并没有发现任何东西,我认为这非常令人惊讶。

我觉得卡在这一点上,因为我觉得我需要故障排除的想法,以便我可以从我的 dmz 主机了解和测试数据库服务器的连接、可见性和凭据。

我如何部署的一点背景是我在我的机器上构建,然后将文件复制到我的 c# Web 应用程序到 dmz 主机上的文件夹中。代码运行良好,直到它尝试调用数据库。

我觉得我的“技能”需要一些帮助,基本上知道何时/如何进行故障排除以及向我的网络窥视者询问什么。

4

1 回答 1

4

这个问题没有反应,但问题已解决。我通过以下方式解决了连接问题:

1) 检查从 dmz web 主机到内部数据库服务器的可访问性

  • 我在该端口上打开了一个到数据库主机的 telnet 会话,并确认它可以访问。
  • 然后我成功创建了到该主机的 odbc 连接

2) 确定为什么我的 .net 应用程序中的连接字符串不起作用

  • 我的代码周围有一个 try/catch 块,所以它静默失败,我无法对消息进行故障排除,因此一位同事建议在 dmz 主机上运行 LinqPad >>
  • 我在该服务器上运行 LinqPad 并在 c# 中编写了一个非常小的数据库连接函数,我的运行方式与我的应用程序尝试连接的方式完全相同。LinqPad 给了我错误!

问题...我创建了一个数据库帐户(因为您不能使用受信任的连接或 Windows 通过身份验证从 dmz 到内部 db 主机)并且我没有为该帐户提供对数据库的任何选择访问权限。

通过确保我的数据库帐户设置正确,问题得以解决。这是我第一次听说 Linqpad,但它最终成为一个非常酷的故障排除工具,因为您可以运行一些 .net 脚本而无需启动项目或编译,因此它节省了一些时间。

于 2012-05-20T05:18:47.513 回答