4

好的,所以我做了一件愚蠢的事情并发布了针对我们的开发数据库(SQL Server 2008 R2)的生产代码(C#,VS2010)。幸运的是,我们还没有使用生产数据库,所以我没有尝试恢复和同步所有内容的痛苦......

但是,我想防止这种情况再次发生,因为它可能会更加痛苦。我的想法是添加一个我可以在启动时查询的表,并通过返回的值确定我连接到的数据库。例如,生产将返回“PROD”,而开发和测试将返回其他值。

如果有任何区别,应用程序会与 WCF 服务对话以访问数据库,因此我在配置文件中有端点,而不是实际的连接字符串。

这有意义吗?其他人是如何解决这个问题的?

谢谢,戴夫

4

4 回答 4

5

解决此问题的最简单方法是无法访问生产帐户。这些存储在我们的 .net 应用程序的 Machine.config 文件中。在非.net 应用程序中,这很容易复制,方法是在一个公共位置有一个配置文件,或者(我敢说)一个保存帐户信息的注册表项。

我们的大多数服务器也是通过别名访问的,因此没有人真正需要将连接字符串从一个环境更改为另一个环境。只需从配置中获取用户,主机文件中的服务器别名会将您指向正确的服务器。这也消除了我们在切换数据库实例(更改硬件等)时必须更新所有配置文件的麻烦。

因此,即使单击一次部署和端点。您可以在最终用户桌面上的机器配置中发布新的端点 URI(我假设这是一个内部应用程序),然后在代码中引用它。

如果你绝对不能这样做,因为这可能需要很多工作(我工作的最后一个地方有 2000 名呼叫中心人员,所以这个推动要困难得多,但仍然可能)。作为为您构建应用程序的最后一步,您始终可以拥有一个自动构建服务器设置,它会为您修改 app.config 文件。然后,您总是从自动构建服务器发布已编译的代码。永远不要让 app.config 中的此类更改成为开发人员流程中的手动步骤。这总会在某些时候导致问题。

现在,如果这些都不起作用,那么我讨厌的最后一个选择(也做了这个),但它有效的是从映射的驱动器中查找值。从本质上讲,公司中的每个人都有一个映射驱动器说 R:。这是您拥有生产配置文件等的地方。生产帐户人员使用生产值映射到一个驱动器位置,而开发人员等使用开发值映射到另一个驱动器位置。与其他选项相比,我讨厌这个选项,但它确实有效,并且它可以让你在其他人变得乏味和困难的情况下避免(由于说办公室政治,设置构建服务器等)。

于 2012-04-03T21:39:22.797 回答
2

我假设您的生产服务器的名称与您的开发服务器不同,所以您可以简单地SELECT @@SERVERNAME AS ServerName.

于 2012-04-03T22:06:21.137 回答
1

不确定这个答案在假设的 .net 环境中是否对您有所帮助,但在 *nix/PHP 环境中,这就是我处理相同情况的方式。

好的,所以我做了愚蠢的事情并发布了生产代码

有时,某些应用程序的行为取决于环境,正如您所逃避的那样。为了提供这种在开发和生产环境之间进行检查的能力,我在全局 /etc/profile/profile.d/custom.sh 配置(CentOS)中添加了以下行:

SERVICE_ENV=dev

在代码中,我有一个包装器方法,它将根据名称获取环境变量并本地化它的值,使其可供我的应用程序代码访问。下面是一个片段,展示了如何检查当前环境并做出相应的反应(在 PHP 中):

public function __call($method, $params)
{
    // Reduce chatter on production envs
    //  Only display debug messages if override told us to
    if (($method === 'debug') &&
        (CoreLib_Api_Environment_Package::getValue(CoreLib_Api_Environment::VAR_LABEL_SERVICE) === CoreLib_Api_Environment::PROD) &&
        (!in_array(CoreLib_Api_Log::DEBUG_ON_PROD_OVERRIDE, $params))) {
        return;
    }
}

请记住,您不希望在应用程序逻辑中添加环境检查,只保留一些极端用例,如代码片段所示。相反,您应该使用 DNS 控制对生产数据库的访问。例如,在您的开发环境中,以下数据库主机名将mydatabase-db解析为本地服务器,而不是您的实际生产服务器。当您将代码推送到生产环境时,您的 DNS 将正确解析主机名,因此您的代码应该“正常工作”而无需任何环境检查。

于 2012-04-03T22:11:11.450 回答
1

经过数小时的关于 MSBuild 和 app.config 操作的教科书和教程的研究,我偶然发现了一个叫做 SlowCheetah - XML Transforms http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5的东西需要它在第一次偶然发现它后不到一小时内完成。绝对推荐!来自文章:

此包使您能够根据构建配置转换您的 app.config 或任何其他 XML 文件。它还添加了额外的工具来帮助您创建 XML 转换。

这个包是由 Sayed Ibrahim Hashimi、Chuck England 和 Bill Heibert 创建的,他也是这本书的作者。如果您正在寻找一种简单的通用方法来根据构建配置转换您的 app.config、web.config 或任何其他 XML 文件,请不要再犹豫了——这个 VS 包将完成这项工作。

是的,我知道我回答了自己的问题,但我已经给出了答案,最终将我指向了真正的答案。现在我需要根据我对问题的新理解返回并编辑问题......

戴夫

于 2012-04-18T21:31:55.243 回答