天天看点

Silverlight获取WebHost配置信息--WebClient和XmlSerializer模拟

  在我们的silverlight项目中,是被打包为xap zip文件下载到客户端,所以silverlight中的app配置文件我们不能直接修改,而在其宿主web host中的web.config在服务端我们也不能直接访问。在我们的项目中遇见了这个问题所以我就有了此博客。

   先说明解决这个问题的方案有:

1:调用wcf,webservice,Asp.net页面等服务端数据源,异步显示在我们的UI。

2:利用silverlight项目的宿主页面 object,传入初始化参数,在silverlight app中获取。

上面的方案都是针对于我们的少量有限配置信息的获取。我这里做的是利用在服务端的xml配置文件来模拟配置文件(为什么不用web.config?以为存在权限信息的问题,所以我觉得尽量避免此文件信息暴露)。在silverlight的异步加载xml文档并解析xml文档。形成配置信息。

为了全局使用,早些加载xml文档,我们需要在app中加一句:

SLConfigManager.Current.ConfigPath = "../SlConfig.xml";//配置文件的路径,相对于我们的xap文件路径。

我们先看一下测试xml:

<?xml version="1.0" encoding="utf-8" ?> 

<Configuration> 

  <appSettings> 

    <add key="test1" value="123"></add> 

    <add key="test2" value="1"></add> 

  </appSettings> 

  <Class ClassID="111"> 

    <Student Age="123"> 

      <Name>ddddd</Name>     

    </Student> 

    <Student  Age="28"> 

      <Name>111</Name>     

  </Class> 

</Configuration

最后附:测试程序打包下载

>

这是我们可以使用:

void Page1_Loaded(object sender, RoutedEventArgs e) 

     { 

         MessageBox.Show(SLConfigManager.Current.GetSection<Class>("Class").ClassID + ""); 

         MessageBox.Show(SLConfigManager.Current.GetAppSettings("test1").ToString()); 

         MessageBox.Show(SLConfigManager.Current.GetAppSettings<Sex>("test2").ToString()); 

     } 

        public enum Sex 

      man,woman 

     }

using System.Xml.Serialization; 

namespace SilverlightApplication2 

    [XmlRoot("Student")] 

    public class Student 

    { 

        [XmlElement("Name")] 

        public string Name 

        { get; set; } 

        [XmlAttribute("Age")] 

        public int Age 

        { 

            get; 

            set; 

        } 

    } 

    [XmlRoot("Class")] 

    public class Class 

        [XmlAttribute("ClassID")] 

        public int ClassID 

        [XmlArray()] 

        [XmlArrayItem("Students")] 

        public System.Collections.Generic.List<Student> Students 

}

  1. View Code   
  2. using System;   
  3. using System.Net;   
  4. using System.Windows;   
  5. using System.Windows.Controls;   
  6. using System.Windows.Documents;   
  7. using System.Windows.Ink;   
  8. using System.Windows.Input;   
  9. using System.Windows.Media;   
  10. using System.Windows.Media.Animation;   
  11. using System.Windows.Shapes;   
  12. using System.Xml;   
  13. using System.Xml.Linq;   
  14. using System.Linq;   
  15. using System.Collections.Generic;   
  16. using Green.Utility.Utils;   
  17. namespace SilverlightApplication2   
  18. {   
  19.     public delegate void LoadComplete();   
  20.     public class SLConfigManager   
  21.     {   
  22.         private XDocument document = null;   
  23.         private static readonly SLConfigManager _SLConfigManager = new SLConfigManager();   
  24.         private Dictionary<string, object> dict = new Dictionary<string, object>();   
  25.         private Dictionary<string, string> appSettings = new Dictionary<string, string>();   
  26.         private string _ConfigPath = null;   
  27.         public static SLConfigManager Current   
  28.         {   
  29.             get   
  30.             {   
  31.                 return _SLConfigManager;   
  32.             }   
  33.         }   
  34.         public string ConfigPath   
  35.         {   
  36.             get { return _ConfigPath; }   
  37.             set   
  38.             {   
  39.                 if (_ConfigPath != value)   
  40.                 {   
  41.                     _ConfigPath = value;   
  42.                     LoadResource();   
  43.                 }   
  44.             }   
  45.         }   
  46.         public bool IsLoaded   
  47.         {   
  48.             get;   
  49.             private set;   
  50.         }   
  51.         public event LoadComplete LoadComplete;   
  52.         public void EnsureLoadResource()   
  53.         {   
  54.             if (document == null)   
  55.             {   
  56.                 LoadResource();   
  57.             }   
  58.         }   
  59.         protected virtual void LoadResource()   
  60.         {   
  61.             if (string.IsNullOrEmpty(ConfigPath))   
  62.             {   
  63.                 throw new Exception("ConfigPath is required!");   
  64.             }   
  65.             dict.Clear();   
  66.             Uri url = new Uri(Application.Current.Host.Source, ConfigPath);   
  67.             WebClient client = new WebClient();   
  68.             client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);   
  69.             client.OpenReadAsync(url, client);   
  70.         }   
  71.         protected virtual void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)   
  72.         {   
  73.             if (e.Error != null)   
  74.             {   
  75.                 throw e.Error;   
  76.             }   
  77.             var sw = new System.IO.StreamReader(e.Result);   
  78.             var xml = sw.ReadToEnd();   
  79.             document = XDocument.Parse(xml);   
  80.             sw.Close();   
  81.             e.Result.Close();   
  82.             sw = null;   
  83.             GetappSettings();   
  84.             IsLoaded = true;   
  85.             if (LoadComplete != null)   
  86.             {   
  87.                 LoadComplete();   
  88.             }   
  89.         }   
  90.         protected virtual void GetappSettings()   
  91.         {   
  92.             if (document != null)   
  93.             {   
  94.                 var appSettingsel = document.Root.Element("appSettings");   
  95.                 if (appSettings != null)   
  96.                 {   
  97.                     appSettingsel.Elements("add").ToList().ForEach(e =>   
  98.                     {   
  99.                         var key = e.Attribute("key").Value;   
  100.                         var value = e.Attribute("value").Value;   
  101.                         if (!string.IsNullOrEmpty(key)&&!this.appSettings.ContainsKey(key))   
  102.                         {   
  103.                             this.appSettings.Add(key, value);   
  104.                         }   
  105.                     });   
  106.                 }   
  107.             }   
  108.         }   
  109.         public T GetSection<T>(string section) where T : class ,new()   
  110.         {   
  111.             if (document == null)   
  112.             {   
  113.                 // throw new Exception("Config Document is null!");                  
  114.             }   
  115.             if (!dict.ContainsKey(section))   
  116.             {   
  117.                 var el = document.Root.Descendants().SingleOrDefault(t => t.Name == section);   
  118.                 var xml = el.ToString();   
  119.                 dict.Add(section, XmlSerializer<T>(xml));   
  120.             }   
  121.             return dict[section] as T;   
  122.         }   
  123.         protected virtual T XmlSerializer<T>(string xml) where T : class ,new()   
  124.         {   
  125.             System.Xml.Serialization.XmlSerializer serialzer = new System.Xml.Serialization.XmlSerializer(typeof(T));   
  126.             System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml));   
  127.             var obj = serialzer.Deserialize(ms) as T;   
  128.             ms.Flush();   
  129.             ms.Close();   
  130.             ms = null;   
  131.             return obj;   
  132.         }   
  133.         public T GetAppSettings<T>(string key) where T : IConvertible   
  134.         {   
  135.             if (appSettings.ContainsKey(key))   
  136.             {   
  137.                 var val = this.appSettings[key];   
  138.                 if (string.IsNullOrEmpty(val))   
  139.                     return default(T);   
  140.                 if (typeof(T).IsEnum)   
  141.                 {   
  142.                     return (T)Enum.Parse(typeof(T), val, true);   
  143.                 }   
  144.                 return (T)Convert.ChangeType(val, typeof(T), null);   
  145.             }   
  146.             return default(T);   
  147.         }   
  148.         public string GetAppSettings(string key)   
  149.         {   
  150.             return GetAppSettings<string>(key);   
  151.         }   
  152.     }   
  153. }  
  154. 复制代码 

继续阅读