2009-01-06 20 views
8

tôi biết rằng tôi có thể tải một file app.config từ một địa điểm khác nhau bằng cách sử dụng dòng mã sau đây:Có thể tải App.Config từ chuỗi hoặc luồng bộ nhớ không?

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", ConfigFile); 

nơi configfile là một vị trí đường dẫn đầy đủ. Những gì tôi muốn làm mặc dù là có thể tải một tập tin đã được mã hóa cho app.config. Lý tưởng nhất, tôi muốn để có thể tải các tập tin, giải mã nó, và tải nó vào một chuỗi hoặc dòng bộ nhớ và vượt qua nó vào ứng dụng như thể nó là app.config. Tôi biết tôi chỉ có thể tải tất cả các giá trị từ nó và truy cập chúng theo cách thủ công, nhưng tôi muốn có thể truy cập chúng bằng cách sử dụng chức năng dựng sẵn của .NET. Có cách nào để yêu cầu ứng dụng sử dụng tệp cấu hình từ một tệp khác ngoài tệp không?

Tùy chọn khác là mở tệp, giải mã, ghi tệp ra tệp tạm thời, sau đó sử dụng mã ở trên để tham chiếu theo cách đó, nhưng nếu có cách dễ dàng hơn, lý tưởng, tôi muốn để tìm ra nó, phải tránh đối phó với các tệp bổ sung.

Trả lời

3

Trong khi tôi chưa bao giờ có thể nhận được câu trả lời cho điều này cho đến nay, tôi đã phải đưa ra một công việc xung quanh. Đây có thể không phải là giải pháp tốt nhất, nhưng nó hoạt động. Về cơ bản những gì chúng tôi đã thực hiện là encypted file app.config của chúng tôi, và cho nó một cái tên mới. Khi ứng dụng khởi động, nó sẽ lấy tệp được mã hóa, giải mã nó và ghi nó vào tệp tạm thời của Windows. Điều này đảm bảo rằng tệp là một số tên ngẫu nhiên duy nhất mà không ai có thể tìm thấy và chúng tôi không phải quản lý tệp, vì Windows sẽ tự động xóa tệp đó cho chúng tôi. Bằng cách này, mỗi lần khởi động lại chúng tôi có thể viết lại một tệp mới và sử dụng nó. Đây là đoạn mã cơ bản cho bất kỳ ai quan tâm.

Phương thức đầu tiên này, LoadFileAppConfig(), sẽ tải lên tệp. Trong trường hợp này, vì chúng là các dịch vụ, chúng ta cần nạp đường dẫn thực hiện và chuyển nó tới phương thức thích hợp. Chúng ta lấy lại đường dẫn của app.config đã giải mã, và sau đó sử dụng phương thức SetData() để đặt nó là đường dẫn app.config.

/// <summary> 
/// Loads the Local App.Config file, and sets it to be the local app.config file 
/// </summary> 
/// <param name="p_ConfigFilePath">The path of the config file to load, i.e. \Logs\</param> 
public void LoadFileAppConfig(string p_ConfigFilePath) 
{ 
    try 
    { 
     // The app.config path is the passed in path + Application Name + .config 
     m_LocalAppConfigFile = ProcessLocalAppConfig(p_ConfigFilePath + this.ApplicationName + ".config"); 

     // This sets the service's app.config property 
     AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", m_LocalAppConfigFile); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

Trong phương pháp này, chúng tôi sẽ giải mã và trả về dưới dạng chuỗi và sau đó ghi tệp đó vào tệp temp Windows của chúng tôi.

public string ProcessLocalAppConfig(string p_ConfigFilePath) 
{ 
    try 
    { 
     string fileName = Path.GetTempFileName(); 
     string unencryptedConfig = DecryptConfigData(p_ConfigFilePath); 

     FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write); 
     StreamWriter streamWriter = new StreamWriter(fileStream); 

     if (!string.IsNullOrEmpty(unencryptedConfig)) 
     { 
      try 
      { 
       streamWriter.BaseStream.Seek(0, SeekOrigin.End); 
       streamWriter.WriteLine(unencryptedConfig); 
      } 

      catch (IOException ex) 
      { 
       Debug.Assert(false, ex.ToString()); 
      } 
      finally 
      { 
       streamWriter.Close(); 
      } 
      return fileName; 
     } 
     return null; 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

phương pháp cuối cùng này có trong đường dẫn của app.config được mã hóa, sử dụng công cụ giải mã của chúng tôi để giải mã các tập tin (đảm bảo rằng chúng tôi có thể giải mã nó, và rằng nó là loại tập tin bên phải) và sau đó trả lại nội dung được giải mã dưới dạng chuỗi thành phương pháp ở trên.

private string DecryptConfigData(string p_AppConfigFile) 
{ 
    string decryptedData = null; 
    TMS.Pearl.SystemFramework.CryptographyManager.CryptographyManager cryptManager = new TMS.Pearl.SystemFramework.CryptographyManager.CryptographyManager(); 
    try 
    { 
     //Attempt to load the file. 
     if (File.Exists(p_AppConfigFile)) 
     { 
      //Load the file's contents and decrypt them if they are encrypted. 
      string rawData = File.ReadAllText(p_AppConfigFile); 

      if (!string.IsNullOrEmpty(rawData)) 
      { 
       if (!rawData.Contains("<?xml")) //assuming that all unencrypted config files will start with an xml tag... 
       { 
        decryptedData = cryptManager.Decrypt(rawData); 
       } 
       else 
       { 
        decryptedData = rawData; 
       } 
      } 
     } 
    } 
    catch (Exception) 
    { 
     throw; 
    } 

    return decryptedData; 
} 
+1

Bất kỳ ai có kiến ​​thức máy tính nhiều hơn đều biết rằng có thể sử dụng trình ghi để xem tất cả IO ghi cho bất kỳ ứng dụng nào. – jgauffin

+0

Tôi không chắc chắn rằng tôi nhận được điểm của bạn ... – Noah

+1

Bạn nên biết rằng thật dễ dàng để tìm cấu hình ứng dụng của bạn. – jgauffin

Các vấn đề liên quan