WPF + .NET 4.5 + ClickOnce部署 - 在客户端计算机上部署应用程序时,一直在解决如何在app.config文件中设置连接字符串的问题,但似乎没有办法!解决这个问题。
如果此问题已经提前询问并且之前已经得到解答,请提供必要的链接 - 提前致谢
好的,在这里,我们开发了一个连接到我们的SQLExpress数据库的WPF应用程序,在开发应用程序机器上,我们使用了很好的连接字符串。我们一直在使用app.config文件中的连接字符串(目前它未加密,但将继续加密)。我们正在使用Clickonce部署技术打包我们的应用程序,以便发送给我们的客户,这也很好,直到我们交给我们的客户。
在客户端,我们需要更改数据库连接字符串,这需要在app.config中应用。但是当使用VStudio打包时,它会获取在我们开发阶段设置的连接字符串,但是如果我们设置客户端连接字符串然后打包它,它就可以正常工作 - 我们理解这一点。我们也了解在使用clickonce部署应用程序时,应用程序安装在“ *%Appdata%\ local \ apps \ 2.0 * ”下。很难在上述路径下搜索相应的文件夹,然后设置连接字符串app.config。
有没有其他方法可以解决使用连接字符串问题的问题?另外一点是我们正在使用实体框架,我们经常使用app.config中的连接字符串来执行必要的过程。
我们想到的一种方法是,使用外部文件存储连接字符串并根据它传递。但挑战在于调用实体框架调用。
任何建议都受到高度赞赏。
答案 0 :(得分:2)
我们的某个应用程序遇到了同样的问题。我们解决了它如下:
MyConnectionString
字符串属性添加到其中MyApp.MySettings.MyConnectionString= cs;
MyApp.MySettings.Save();
然后您可以在代码中构建连接字符串,如How to: Build an EntityConnection Connection String
中所述使用“设置”文件的好处是框架负责保存/保存等,并且您还具有强类型代码支持。
关于加密 - 您可以在保存到设置文件之前加密它,并在读取时解密。我认为这很简单。
答案 1 :(得分:0)
我已经使用app config来选择要使用的服务端点,所以我认为这非常相似:
的App.config
<add key="DEBUGServiceEndpoint" value="http://localhost:4398/Service.svc" />
<add key="DEVServiceEndpoint" value="http://dev/Service/Service.svc" />
<add key="TESTServiceEndpoint" value="http://testws/Service/Service.svc" />
<add key="PRODServiceEndpoint" value="http://ws/Service/Service.svc" />
然后使用编译器指令选择要使用的字符串:
private string ServiceEndpoint
{
get
{
#if DEV
return ConfigurationManager.AppSettings["DEVServiceEndpoint"];
#elif DEBUG
return ConfigurationManager.AppSettings["DEBUGServiceEndpoint"];
#elif TEST
return ConfigurationManager.AppSettings["TESTServiceEndpoint"];
#elif PRODUCTION
return ConfigurationManager.AppSettings["PRODServiceEndpoint"];
#endif
}
}
在你的情况下,这看起来像这样:
App.Config中
<connectionStrings>
<add name="Dev" connectionString="stuff" providerName="System.Data.SqlClient" />
<add name="Test" connectionString="stuff" providerName="System.Data.SqlClient" />
<add name="Prod" connectionString="stuff" providerName="System.Data.SqlClient" />
</connectionStrings>
代码中的连接字符串:
private string ConnectionString
{
get
{
#if DEV
return ConfigurationManager.ConnectionStrings["Dev"].ConnectionString;
#elif DEBUG
return ConfigurationManager.ConnectionStrings["Dev"].ConnectionString;
#elif TEST
return ConfigurationManager.ConnectionStrings["Test"].ConnectionString;
#elif PRODUCTION
return ConfigurationManager.ConnectionStrings["Prod"].ConnectionString;
#endif
}
}
答案 2 :(得分:0)
这是一种通过 ClickOnce 更新 app.config 中连接字符串的方法。在启动应用程序时和使用 app.config 中的值之前放置此代码:
UpdateCheckInfo info = null; //optional if(info.UpdateAvailable)
if (ApplicationDeployment.IsNetworkDeployed)
{
ApplicationDeployment deployment = ApplicationDeployment.CurrentDeployment;
string configPath = Application.ExecutablePath + ".config";
if (deployment.IsFirstRun)
{
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");
//example for a connectionstring you want to deploy while using your own connectionstring for developing in your own App.config
connectionStringsSection.ConnectionStrings["ConnectionString"].ConnectionString = @"Integrated Security=SSPI;Pooling=true;Data Source=sqlServer_here;Initial Catalog=db_here";
config.Save();
ConfigurationManager.RefreshSection("connectionStrings");
}
}