0

在我的 web.config 文件中,我有两个 SQL Server 连接字符串,一个用于本地,一个用于实时:

<connectionStrings>
    <remove name="LocalSqlServer" />
    <add name="LocalSqlServer" connectionString="[removed]" providerName="System.Data.SqlClient"/>
    <add name="LiveSqlServer" connectionString="[removed]" providerName="System.Data.SqlClient"/>
</connectionStrings>

然后我有一个“utils”单例类,它基本上根据我是在“localhost”还是在我的实时服务器上运行站点来设置连接字符串:

if (Environment.MachineName.ToUpper() == MyOwnConfig.GetAppSettingsValue(ConfigKeys.localhost).ToUpper()) {
    this.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString();
    //MembershipProvider provider = Membership.Providers["LocalAspNetMemberSqlProvider"];
    //RoleProvider role = Roles.Providers["LocalAspNetMemberSqlProvider"];
}
else {
    this.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["LiveSqlServer"].ToString();
    //MembershipProvider provider = Membership.Providers["LiveAspNetMemberSqlProvider"];
    //RoleProvider role = Roles.Providers["LiveAspNetMemberSqlProvider"];
}

然后我的 Database 类只使用我的 utils 类的 connectionString 属性。所有这一切都很好,因此当我将站点放置在本地时,我可以简单地将其上传到现场,而无需更改配置文件中的连接字符串等,并且它开始使用我的实时数据库。

现在,我目前正在我的网站中实现“会员资格”,并且对于使用一些 webmethods 的 ajax,我将 providerUserKey 存储在当前登录用户的文本字段中。然后,我的 Web 方法会检查此密钥是否已通过身份验证。例如

ajaxCreds.ajaxID1 = ((MembershipUser)Membership.GetUser()).ProviderUserKey.ToString();

问题:我的问题是我如何知道这个成员是来自 LIVE 数据库还是我的 LOCAL 数据库。正如您从网络配置中看到的那样,我已在成员资格/提供者行中添加(已注释掉),但我不知道如何将它们与上述成员资格.getUser() 命令一起使用。

替代方案...这是一个好方法吗?或者当我上传到现场时编辑 web.config 文件是否更简单?

非常感谢

4

2 回答 2

1

大多数人不这样做,尽管我为你弄清楚这一切而鼓掌。通常,人们使用部署管理器或其他构建系统在服务器上与本地具有不同的 web.config 值。

以下是有关更改部署的链接:如何在我的连接字符串上使用 Web.Config 转换?

于 2012-11-11T13:22:46.810 回答
1

我建议你阅读这篇文章:

http://blogs.msdn.com/b/schlepticons/archive/2010/07/22/modifying-asp-net-providers-at-runtime.aspx

它会告诉你,其他人也在尝试做类似的事情。这就是成功的方法。解决方案(如果调整)可能与您的需求相似。

  • 将所有提供程序放入您的 web.config
  • 在 App_Start 上调整默认设置(基于环境)
  • MembershipAPI 将根据您的需要提供 Provider Key
  • 无需按名称搜索提供者

注意:您必须调整void Application_Start(object sender, EventArgs e)实现,但想法就在那里

注意2:您尝试做的绝对不是例外。基于环境的配置非常聪明!必须实现的是标准 API 使用,例如通过 Manager 模式调用

  • System.Web.Security.Membership
  • System.Web.Security.Roles

而不是按名称调用提供者。

于 2012-11-11T13:43:22.410 回答