Clickonce app.config连接字符串

时间:2014-02-17 14:02:58

标签: .net wpf visual-studio-2012 clickonce

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中的连接字符串来执行必要的过程。

我们想到的一种方法是,使用外部文件存储连接字符串并根据它传递。但挑战在于调用实体框架调用。

任何建议都受到高度赞赏。

3 个答案:

答案 0 :(得分:2)

我们的某个应用程序遇到了同样的问题。我们解决了它如下:

  1. 将设置文件添加到项目中,并将MyConnectionString字符串属性添加到其中
  2. 当应用程序第一次启动时 - 显示“请输入您的连接字符串”表单 - 并让用户输入他的连接字符串。验证它是否有效,然后将其保存到设置中:
  3. 像这样:

    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");
    }
}