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>     
    </Student> 
  </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 
     }

在这里我们模拟了AppSettings,和Section(注:这里的section,不需要预申明,在利用xml转化形成的,更利于我们的配置扩展性,使用到了XmlRoot,XmlElement等attribute),在看看我们的Class类:

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 
        { 
            get; 
            set; 
        } 

        [XmlArray()] 
        [XmlArrayItem("Students")] 
        public System.Collections.Generic.List<Student> Students 
        { 
            get; 
            set; 
        } 
    } 
}

最后需要说明的是:在于我们的项目中可能存在xml文件还没有加载,的情况,所以加入了时间支持和IsLoaded属性标示。

源码:

using System; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Ink; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.Xml; 
using System.Xml.Linq; 
using System.Linq; 
using System.Collections.Generic; 
using Green.Utility.Utils; 

namespace SilverlightApplication2 

    public delegate void LoadComplete(); 

    public class SLConfigManager 
    { 
        private XDocument document = null; 

        private static readonly SLConfigManager _SLConfigManager = new SLConfigManager(); 
        private Dictionary<string, object> dict = new Dictionary<string, object>(); 
        private Dictionary<string, string> appSettings = new Dictionary<string, string>(); 
        private string _ConfigPath = null; 

        public static SLConfigManager Current 
        { 
            get 
            { 
                return _SLConfigManager; 
            } 
        } 

        public string ConfigPath 
        { 
            get { return _ConfigPath; } 
            set 
            { 
                if (_ConfigPath != value) 
                { 
                    _ConfigPath = value; 
                    LoadResource(); 
                } 
            } 
        } 

        public bool IsLoaded 
        { 
            get; 
            private set; 
        } 
        public event LoadComplete LoadComplete; 

        public void EnsureLoadResource() 
        { 

            if (document == null) 
            { 
                LoadResource(); 
            } 
        } 

        protected virtual void LoadResource() 
        { 
            if (string.IsNullOrEmpty(ConfigPath)) 
            { 
                throw new Exception("ConfigPath is required!"); 
            } 

            dict.Clear(); 
            Uri url = new Uri(Application.Current.Host.Source, ConfigPath); 
            WebClient client = new WebClient(); 
            client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted); 
            client.OpenReadAsync(url, client); 
        } 

        protected virtual void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
        { 
            if (e.Error != null) 
            { 
                throw e.Error; 
            } 

            var sw = new System.IO.StreamReader(e.Result); 
            var xml = sw.ReadToEnd(); 
            document = XDocument.Parse(xml); 
            sw.Close(); 
            e.Result.Close(); 
            sw = null; 

            GetappSettings(); 

            IsLoaded = true; 
            if (LoadComplete != null) 
            { 
                LoadComplete(); 
            } 
        } 

        protected virtual void GetappSettings() 
        { 
            if (document != null) 
            { 
                var appSettingsel = document.Root.Element("appSettings"); 
                if (appSettings != null) 
                { 
                    appSettingsel.Elements("add").ToList().ForEach(e => 
                    { 
                        var key = e.Attribute("key").Value; 
                        var value = e.Attribute("value").Value; 
                        if (!string.IsNullOrEmpty(key)&&!this.appSettings.ContainsKey(key)) 
                        { 
                            this.appSettings.Add(key, value); 
                        } 
                    }); 
                } 
            } 
        } 

        public T GetSection<T>(string section) where T : class ,new() 
        { 
            if (document == null) 
            { 
                // throw new Exception("Config Document is null!");                
            } 
            if (!dict.ContainsKey(section)) 
            { 
                var el = document.Root.Descendants().SingleOrDefault(t => t.Name == section); 
                var xml = el.ToString(); 
                dict.Add(section, XmlSerializer<T>(xml)); 
            } 
            return dict[section] as T; 
        } 

        protected virtual T XmlSerializer<T>(string xml) where T : class ,new() 
        { 
            System.Xml.Serialization.XmlSerializer serialzer = new System.Xml.Serialization.XmlSerializer(typeof(T)); 
            System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml)); 
            var obj = serialzer.Deserialize(ms) as T; 
            ms.Flush(); 
            ms.Close(); 
            ms = null; 
            return obj; 
        } 

        public T GetAppSettings<T>(string key) where T : IConvertible 
        { 
            if (appSettings.ContainsKey(key)) 
            { 
                var val = this.appSettings[key]; 
                if (string.IsNullOrEmpty(val)) 
                    return default(T); 
                if (typeof(T).IsEnum) 
                { 
                    return (T)Enum.Parse(typeof(T), val, true); 
                } 
                return (T)Convert.ChangeType(val, typeof(T), null); 
            } 
            return default(T); 
        } 

        public string GetAppSettings(string key) 
        { 
            return GetAppSettings<string>(key); 
        } 
    } 
}

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

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2011/07/06/SlConfig.html

时间: 2024-11-15 16:50:44

Silverlight获取WebHost配置信息--WebClient和XmlSerializer模拟的相关文章

Android获取手机配置信息具体实现代码_Android

复制代码 代码如下: StringBuilder phoneInfo = new StringBuilder(); phoneInfo.append("Product: " + android.os.Build.PRODUCT + System.getProperty("line.separator")); phoneInfo.append( "CPU_ABI: " + android.os.Build.CPU_ABI + System.getP

使用Unity(二):配置Unity 、读取配置信息和获取对象

和 Enterprise Library 的其他应用程序块一样,Unity 的行为也可以通过配置来指定. Unity 应用程序块可以从 XML 配置文件中读取配置信息.配置文件可以是 Windows Forms 应用程序的 App.config 或者 ASP.NET 应用程序的 Web.config.当然,也可以从任何其他 XML 格式的文件或者其他数据源中加载配置信息. 在本文中,将和大家一起来学习 Unity 配置文件的格式.配置的读取.通过示例说明实例的获取. 1. Unity 配置文件的

怎么查看电脑系统配置 用记事本快速获取配置信息

我们常会查看电脑的基本配置信息,怎么查看信息呢,本文教你一种利用记事本获取系统配置信息的方法. 在通常情况下,我们需要借助一个系统工具软件来获取系统信息.如果身边没有可用的软件工具,我们如何获取系统配置信息呢? 下面介绍的方法只利用记事本工具,就能很轻松地获取系统配置信息的文本文件.下面是具体的实现方法: 第一步:编辑一个TXT文本文件,文件可命名为"获取系统配置信息.TXT",在文件中输入以下一行内容"systeminfo>D:系统配置清单.TXT",然后保

端口配置属性-如何获取H3C和思科交换机的端口配置信息

问题描述 如何获取H3C和思科交换机的端口配置信息 对于交换机不是很了解,别人问的"端口配置信息",具体含义不太清楚,目前的理解是服务端口信息,类似于操作系统中开启了哪些服务端口,目前了解H3C交换机查看TCP端口的命令为display tcp status,但是没有查到udp的,请问有没有相应的命令?还有思科交换机的查到show tcp 命令,有没有更明确的命令以及UDP的命令. 解决方案 一般意义上的'交换机端口信息'为交换机端口的TRUNK和access及hybrid类型,及上面

JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用

[正文] 一.ServletConfig:代表当前Servlet在web.xml中的配置信息(用的不多) String getServletName()  -- 获取当前Servlet在web.xml中配置的名字 String getInitParameter(String name) -- 获取当前Servlet指定名称的初始化参数的值 Enumeration getInitParameterNames()  -- 获取当前Servlet所有初始化参数的名字组成的枚举 ServletConte

【DataGuarad】获取standby 库的配置信息的脚本

从oracle MOS 上获得一个关于获取standby 库的配置信息的脚本 Note 241438.1 Script. to Collect Data Guard Physical Standby Diagnostic Information set echo off  set feedback off  column timecol new_value timestamp  column spool_extension new_value suffix  select to_char(sys

asp使用wmi获取本地服务信息不成功

问题描述 asp使用wmi获取本地服务信息不成功 strComputer = "." Set objSWbemServices = GetObject("winmgmts:\" & strComputer & "rootCIMV2") Set objSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM Win32_Service",,48) For

钉钉手机端应用获取当前用户信息流程

先吐个槽,钉钉的"开发者中心"是直接对接的阿里云的后台,跳来跳去很容易懵圈,再加上钉钉的文档,它内容倒是有,但是组织方式不是按流程来的,而是按模块来的,这样的结果就是你要通过文档去了解某个完整的流程怎么处理,也要跳来跳去,转一圈下来看得都有点恶心了. 这里说的"获取当前用户信息",最有价值的一点,是获取手机端当前用户的在某企业的一个工号(至于到底是不是工号,或者其它的标识,那是管理员在后台自己维护的).有了这个用户标识,就可以实现"直接登录"等功

ASP.NET Core的配置(1):读取配置信息

提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置信息定义在这两个文件之中.到了.NET Core的时候,很多我们习以为常的东西都发生了改变,其中也包括定义配置的方式.总的来说,新的配置系统显得更加轻量级,并且具有更好的扩展性,其最大的特点就是支持多样化的数据源.我们可以采用内存的变量作为配置的数据源,也可以直接配置定义在持久化的文件甚至数据库中. 由