2014-02-17 87 views
1

WPF + .NET 4.5 + ClickOnce部署 - 當應用程序部署在客戶機上時,一直在解決如何在app.config文件中設置連接字符串的問題,但似乎就像沒有辦法!解決這個問題。Clickonce app.config連接字符串

如果這個問題已經被事先問及以前已經回答,請向我們提供必要的聯繫 - 在此先感謝

OK,這裏有雲,我們已經開發出連接到我們的SQLExpress的WPF應用程序DB和開發應用程序機器上,我們使用的連接字符串很好。我們一直在使用app.config文件中的連接字符串(目前它沒有加密,但將來會被加密)。我們正在使用Clickonce部署技術將我們的應用程序打包發送給我們的客戶,這也很好,直到我們移交給我們的客戶。

在客戶端,我們需要更改數據庫連接字符串,這需要在app.config中應用。但是當使用VStudio打包它時,它需要在開發階段設置的連接字符串,但是如果我們設置客戶端連接字符串並將其打包,則它可以正常工作 - 我們理解這一點。我們也瞭解在使用clickonce部署應用程序時,應用程序將安裝在「*%Appdata%\ local \ apps \ 2.0 *」下。很難在上面的路徑下搜索相應的文件夾,然後設置連接字符串app.config。

是否有任何其他方式使這種排序使用連接字符串問題?另一點是我們使用的是實體框架,並且我們經常使用來自app.config的連接字符串來完成必要的過程。

其中一種方法是我們認爲是使用外部文件來存儲連接字符串並將其傳遞。但挑戰在於何時調用實體框架調用。

任何建議,非常感謝。

+0

只是爲了澄清 - 你問的關於在ClickOnce應用程序運行時更改連接字符串?這意味着您的客戶負責設置SQL Server併爲您的應用程序提供正確的連接字符串? – avs099

+0

@ avs099是這些行上的東西。 – aioracle

回答

2

,我們有同樣的問題與我們的應用程序之一。我們解決了它,如下所示:

  1. 添加設置文件到您的項目,並添加MyConnectionString字符串屬性進去
  2. 當應用程序首次啓動時間 - 顯示「請輸入您的連接字符串」的形式 - 讓用戶輸入他的連接字符串。驗證它是有效的,然後將其保存到設置:

這樣的:

MyApp.MySettings.MyConnectionString= cs; 
MyApp.MySettings.Save(); 

,然後在此How to: Build an EntityConnection Connection String

使用的好處描述,你可以建立在代碼中的連接字符串「設置「文件是框架負責保存/保存它等,並且你也有強類型的代碼支持。

關於加密 - 您可以在保存到設置文件之前加密它,並在讀取時解密。我認爲這很簡單。

+0

這聽起來很有趣,我也嘗試過,似乎工作。但是,我在app +中成功編譯了更改。但是,我從\ debug文件夾運行了應用程序,它確實運行並且成功提交了更改。但是,\ debug文件夾中的默認settings.settings文件在哪裏?我無法找到這個。 – aioracle

+0

設置作爲自定義部分嵌入到<> .config文件中。 – avs099

+0

我檢查了文件<> .config文件,包含該部分,但值沒有變化。但仍然當我運行應用程序時,它顯示更改的值。 – aioracle

0

我已經使用了應用程序配置挑來消耗它的服務端點,所以我覺得這是很相似的:

的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 
     } 
    } 
+0

聽起來有趣 - 但連接字符串加密呢?你的意思是我們加密數據並存儲在app.config中,然後根據請求解密並相應地使用它? – aioracle

+0

但這種方法意味着你必須知道客戶端將使用的連接字符串 - 而我的理解是,情況並非如此...... – avs099

+0

@aioracle我相信你應該加密你的連接字符串,無論如何。我過去一直遵循[本指南](http://msdn.microsoft.com/zh-cn/library/89211k9b%28VS.80%29.aspx)。幸運的是(或者不幸:)),我在一個大部分工作都在內部網絡上工作的地方工作,安全並不總是最關心的問題。 –

相關問題