Asp.net mvc 3 如何在源代码中的一个位置替换配置文件数据库链接?(asp.net/razor)
我有一个ASP.NET/Razor 3 web应用程序,它通过MS EntityFramework使用SQL Server数据库 如果/当我想要更改数据库连接字符串,例如更改密码或指向其他数据库(例如,test vs.live),则需要在项目中三个不同XML配置文件(app.config、web.config和app.release.config)中的大约七个位置替换该字符串,这是一个容易出错的问题 更糟糕的是,未处理异常的默认web服务器行为可能包括向web用户显示配置文件的部分,这实际上导致web服务器显示在web上显示数据库路径和密码的行。不太好 出于这两个原因,并且由于这不是一个任何人都会在服务器上编辑配置文件的产品(任何更改都是构建操作),因此我更希望将数据库连接信息编译到web应用程序中,并从代码加载,而不是从配置文件加载,为了能够做到这一点,当我想要更改数据库信息时,我可以在一个地方而不是七个地方进行更改Asp.net mvc 3 如何在源代码中的一个位置替换配置文件数据库链接?(asp.net/razor),asp.net-mvc-3,razor,web-config,connection-string,Asp.net Mvc 3,Razor,Web Config,Connection String,我有一个ASP.NET/Razor 3 web应用程序,它通过MS EntityFramework使用SQL Server数据库 如果/当我想要更改数据库连接字符串,例如更改密码或指向其他数据库(例如,test vs.live),则需要在项目中三个不同XML配置文件(app.config、web.config和app.release.config)中的大约七个位置替换该字符串,这是一个容易出错的问题 更糟糕的是,未处理异常的默认web服务器行为可能包括向web用户显示配置文件的部分,这实际上导致
如何实现这一点?可以在Global.asax.cs文件的1个位置集中设置数据库连接字符串,作为应用程序状态的一部分,然后从项目中的任何其他位置引用 步骤1:在Global.asax.cs中将连接字符串定义为静态变量:
namespace TestProject
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static string ConnectionString1;
public static string ConnectionString2;
protected void Application_Start()
{
#region Build application state for the app-specific items needed by us
ConnectionString1 = "Server=yourserver;Database=yourdb;etc etc";
ConnectionString2 = "Server=yourserver;Database=yourdb;etc etc";
#endregion
#region Code auto-generated and needed by system - do not change
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
#endregion
}
}
}
步骤2:使用项目中任何其他位置的字符串:
string cnxStr1 = TestProject.MvcApplication.ConnectionString1;
string cnxStr2 = TestProject.MvcApplication.ConnectionString2;
(请注意,默认情况下,只能从同一项目中访问字符串。如果需要使用同一解决方案中任何其他项目中的字符串,则需要添加对该项目的引用。)可以在Global.asax.cs文件的1个位置集中设置数据库连接字符串,作为应用程序状态的一部分,然后从项目中的任何其他位置引用 步骤1:在Global.asax.cs中将连接字符串定义为静态变量:
namespace TestProject
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static string ConnectionString1;
public static string ConnectionString2;
protected void Application_Start()
{
#region Build application state for the app-specific items needed by us
ConnectionString1 = "Server=yourserver;Database=yourdb;etc etc";
ConnectionString2 = "Server=yourserver;Database=yourdb;etc etc";
#endregion
#region Code auto-generated and needed by system - do not change
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
#endregion
}
}
}
步骤2:使用项目中任何其他位置的字符串:
string cnxStr1 = TestProject.MvcApplication.ConnectionString1;
string cnxStr2 = TestProject.MvcApplication.ConnectionString2;
(请注意,默认情况下,字符串只能从同一项目中访问。如果需要使用同一解决方案中任何其他项目中的字符串,则需要添加对该项目的引用。)Krishna的上述回答非常好。对我来说,我个人更喜欢将它们作为静态类中的静态字符串,并在需要的地方使用它。克里希纳的上述答案非常好。对我来说,我个人更喜欢将它们作为静态类中的静态字符串,并在需要时使用它。如果不想将连接字符串放入全局文件中,可以:
对于您描述的第二个问题,您可以为每个环境(开发、测试、生产)提供一个单独的connectionStrings.config文件。使用配置转换或某些其他过程,您只需更新每个connectionString元素中的configSource属性即可切换环境。如果不想将连接字符串放入全局文件,可以:
对于您描述的第二个问题,您可以为每个环境(开发、测试、生产)提供一个单独的connectionStrings.config文件。使用配置转换或其他过程,您只需更新每个connectionString元素中的configSource属性即可切换环境。回答得很好。遗憾的是,行动组懒得颁发赏金。是的,我同意,很抱歉我没能颁发赏金,因为一场大灾难让我忘记了这个问题,而且似乎有一个最后期限(?)来颁发赏金?我现在才开始回到这个问题上,稍后会查看这个和另一个答案,看看我是否能让它们发挥作用。没问题,@Dronz!我希望事情已经解决了,现在一切都恢复正常了。回答得好。遗憾的是,行动组懒得颁发赏金。是的,我同意,很抱歉我没能颁发赏金,因为一场大灾难让我忘记了这个问题,而且似乎有一个最后期限(?)来颁发赏金?我现在才开始回到这个问题上来,我会检查一下