【问题标题】:Database Deployment issues数据库部署问题
【发布时间】:2011-09-27 19:15:59
【问题描述】:

我很难部署我的网站。 我遇到了一些错误,它们得到了解决,我成功发布了我的网站,但是当我尝试打开任何页面时,它给了我 404 或 500 错误

我的主机提供商告诉我,如果此页面正在使用数据库并且未部署,那么这可能是问题所在 所以我尝试部署我的数据库,但我得到了 connectionString 错误。

问题是我没有在 web.config 中存储我的 connectionString 它存储在我的基本 DAL 类的一个属性中,并被所有 DAL 类使用 所以我更新了它,但我得到了同样的错误

我不知道怎么了,我应该在 web.config 中包含 connectionString 吗?

注意当我构建包并尝试将活动模式设置为“发布”时,它会将设置返回为“调试”!

【问题讨论】:

  • 尝试用你的网站在vs调试器模式下连接到你的远程数据库,看看有什么异常。
  • 数据库是否托管在您的托管服务提供商可以访问的某个地方?
  • @mservidio .. 我尝试从 VS2010 访问我的数据库,它成功了,我没有遇到任何问题,我运行了查询和东西
  • @alun .. 我不确定我是否理解您的问题,它托管在 SqlExpress 中的本地计算机上。他们能够访问和发布我的表示层,我认为他们也可以访问数据库。对不起,你能澄清一下你到底想知道什么吗?
  • 除非您设置特定的响应标头或您的托管服务提供商有一些奇怪的配置,否则 404 意味着您甚至没有访问您的页面,而 500 通常意味着 IIS 无法解析您的 web.config 文件。

标签: c# asp.net sql-server-2008 deployment webforms


【解决方案1】:

“我应该在 web.config 中包含 connectionString 吗?”

是的,正是出于这个原因,您的连接字符串应该在 web.config 的 <connectionStrings> 部分中定义 - 这样您就可以在将应用程序部署到不同环境时轻松更改设置以指向不同的数据库环境,无需重新编译代码。

【讨论】:

  • 好的,但是我已经在我的基础 DAL 类中定义了一个连接字符串,并且我将其更新为设置为我的新数据库连接字符串。当我发布它时,它已经重建了我的类并创建了一个新的 DLL,我错了吗?
【解决方案2】:

IIS 可以识别配置文件中的连接字符串。在查看某个应用程序时,我已经看到它通过 IIS 管理控制台公开它们。我曾经遇到过类似的问题,结果证明这是一个身份验证问题。 IIS 上的应用程序在某个池中和某个用户下运行。如果您在连接字符串中指定使用 Windows 身份验证(集成安全),则此用户必须有权访问数据库。如果运行应用程序的用户没有连接到数据库的必要权限,您应该在连接字符串中明确指定用户名和密码。

在任何情况下,您都可以在 web.config 中打开 includeExceptionDetailInFaults 并获取更多关于您的服务为何会失败的信息 (msdn):

<serviceBehaviors>
  <behavior>
    <serviceDebug includeExceptionDetailInFaults="true"/>
  </behavior>
</serviceBehaviors>

【讨论】:

  • 我认为这很好,但我有一个共享主机帐户,所以我需要指定一个用户并通过,我已经在我的 connectionString 中声明了它。也许问题与我的查询有关..例如,我的 sql 语句如下所示“SELECT * FROM Table1 not user.Table1 .. 我是否必须更改整个 DAL 以包含 db 用户?..顺便说一句,我在其中声明了我的 connectionString一个类,以保护任何使用我的应用程序修改它的人,所以我可能是唯一可以使这个应用程序工作的人,所以这是错误的吗?
  • 您不能真正“保护”连接字符串。当然,您可以阻止人们对其进行修改,但是您为什么要这样做有点值得怀疑。保护此信息的唯一方法是完全删除它并让用户或最终用户提供它。当然,在 IIS 上运行的应用程序中没有办法,只能包含它。但是,如果您将其包含在配置中,您仍然只能在 IIS 本地执行此操作,而不必将此字符串发送到其他地方。
  • 关于您的查询,我认为这应该不是问题。如果有,那么您需要使用方案名称来限定它(dbo 是默认名称)。而且您还必须考虑查询确实在本地工作。您是否已经尝试获取确切的异常详细信息?我认为为了调试你应该暂时打开它,否则你只是在猜测。
  • DonAndre 我同意你的观点,但我不知道我应该在 web.config 的哪些部分添加它?我应该把它放在主 web.config 还是第一个版本中?
  • 我在主配置中有本地调试连​​接字符串,在发行版中我使用 xdt:Transform 替换它。连接字符串进入configuration 部分。包括异常进入配置 > system.servicemodel > 行为。
【解决方案3】:

假设您的 DAL 是一个类库,我会将连接字符串存储在 app.config 中。这样,您可以轻松更改连接字符串,而无需将连接字符串放入使用该库的每个 Web 应用程序中。

【讨论】:

  • 是的,它是一个类库。我有一个我所有的 DAL 类都继承自的基类。在基类中,我有在开发阶段设置的属性 ConnectionString,完成后它在 DLL 中受到保护,从该基类继承的任何类都可以非常轻松地使用属性 ConnectionString。唯一需要了解我的数据库及其 connectionString 的层是 DAL .. 所以我的 Web 应用程序永远不需要知道 connectionString 是什么 .. 我试图为您提供有关我的设计的更多详细信息,希望您能提供帮助
  • 如果您有ConnectionString 属性从库的app.config 中拉取连接字符串,您的设计将更加灵活。如果您担心安全性,只需在部署后加密连接字符串部分即可。
  • 好的,如果我这样做了,我不需要 web.config 中的任何 connectionStrings 吗? ..顺便说一句,我在哪里可以找到 app.config ?
  • 没错。您不需要将连接字符串存储在 web.config 中。如果类库不包含 app.config 文件,只需转到 Add &gt; New Item &gt; Application Configuration File 添加一个
【解决方案4】:

“问题是我没有将我的 connectionString 存储在 web.config 中它存储在我的基本 DAL 类的一个属性中,并且它被所有 DAL 类使用,所以我更新了它,但我得到了同样的错误”

是的,硬编码连接字符串是一个主要问题。要回答您的下一个问题“我应该在 web.config 中包含 connectionString 吗?”,答案是肯定的。

至于正确部署数据库,可以看我2008年创建的this blog entry。

【讨论】:

  • 好的,但是 connectionString 将位于 Web 应用程序项目中,而我的 DAL 位于一个单独的类库中......我如何能够从我的 DAL 中访问它?
  • 如果您不能神奇地从配置中获取连接字符串,您认为如何将其获取到 DAL 类?获取它的机制很简单:将其作为参数传递给调用以获取数据的方法。我假设,因为你有硬编码,你已经有了设置连接字符串的机制。
  • hmm 所以每次我连接到数据库时我都应该传递 ConnectionString ? .. 没有办法将它存储在 web.config 中以避免硬编码 connectionString 的问题,并且仍然可以从我的 DAL 类库中访问 web.config 连接字符串?
  • 您可以这样做,但关注点分离要求单独的库提供其答案,而不是从配置中提取。如果你不将你的 DAL 紧密耦合到 UI 配置。我已经看到有人为配置库而创建了一个 kludge,但是为什么在你不需要的时候使用大量的反射。
  • 格雷戈里!你让我很困惑。那么如何才能避免耦合我的应用程序并且仍然可以发布我的网络解决方案以在线工作:S?
【解决方案5】:

很抱歉,但所有答案都告诉我,我需要将“ConnectionString”放在“Web.config”中,但实际上,当我将应用程序添加到虚拟目录并且我不需要时,整个问题都解决了更改我的 DAL 层或向 web.config 添加任何内容

当然,我从你的回答中学到了东西,我很感激,但不,如果我决定采用这种设计模式,我不需要在我的 web.config 中添加任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2018-04-11
    • 2010-09-26
    • 2011-07-19
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多