【利用静态网站传输数据】
前一阵子在弄github的网站,发现在github上可以免费的建立一整套静态网站。
而最近在弄一些个人的小软件,然而软件是需要不断改进的,可是我又没有个人服务器,那怎么办?
这个时候我想到了github。
由于github是一个静态网站,同时也是一个免费的云盘,可以在上面存任何的东西,于是我就想能不能把最新的版本信息存在github上面,然后通过网页的方式访问指定的网页从而获取最新的版本号和下载地址?
经过一番小小的折腾,初步的模板已经完成:
基本流程是通过xml记录版本号和下载地址-》上传到github上-》再在客户端通过网页读取xml信息-》把xml信息在本地解析成相应的类,从而获得信息。
首先是一个开源的.net xml生成解析类,这是我在网上找到的一个开源的工具,自己稍微修改了一下,如果原作者不想再这里公开,可以联系我。
这个xml类似通过.net的序列化来生成xml的,简单方便快捷。所以就一直沿用了;
/* 2015.12.28 BobDong * 生成xml文件,记录生成的表名 */ using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; namespace 模拟网站登录 { class XmlHelper { #region 序列化操作 /// <summary> /// 序列化对象 /// </summary> /// <param name="stream"></param> /// <param name="o"></param> /// <param name="encoding"></param> private static void XmlSerializeInternal(Stream stream, object o, Encoding encoding) { if (o == null) throw new ArgumentNullException("o"); if (encoding == null) throw new ArgumentNullException("encoding"); XmlSerializer serializer = new XmlSerializer(o.GetType()); XmlWriterSettings settings = new XmlWriterSettings { Indent = true, NewLineChars = "\r\n", Encoding = encoding, IndentChars = " " }; using (XmlWriter writer = XmlWriter.Create(stream, settings)) { serializer.Serialize(writer, o); writer.Close(); } } /// <summary> /// 将一个对象序列化为XML字符串 /// </summary> /// <param name="o">要序列化的对象</param> /// <returns>序列化产生的XML字符串</returns> public static string XmlSerialize(object o) { try { using (MemoryStream stream = new MemoryStream()) { XmlSerializeInternal(stream, o, Encoding.UTF8); stream.Position = 0; using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { return reader.ReadToEnd(); } } } catch { return null; } } /// <summary> /// 以【Encoding.UTF8】反序列化xml /// </summary> /// <typeparam name="T">结果对象类型</typeparam> /// <param name="s">包含对象的XML字符串</param> /// <returns>反序列化得到的对象</returns> public static T XmlDeserialize<T>(string s) { if (string.IsNullOrEmpty(s)) throw new ArgumentNullException("s"); XmlSerializer mySerializer = new XmlSerializer(typeof(T)); using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(s))) { using (StreamReader sr = new StreamReader(ms, Encoding.UTF8)) { return (T)mySerializer.Deserialize(sr); } } } #endregion } }
接着是读取网页代码的类,【log模块被我删掉了,需要的可以在相应的位置加上日志】
using System; using System.IO; using System.Net; using System.Text; namespace 模拟网站登录 { public static class WebData { public static T LoadData<T>(string path,Encoding encoding) { WebRequest request = WebRequest.Create(path);//实例化WebRequest对象 WebResponse response = request.GetResponse();//创建WebResponse对象 Stream datastream = response.GetResponseStream();//创建流对象 T resoult=default(T); if (datastream == null) { return resoult; } StreamReader reader = new StreamReader(datastream, encoding); string responseFromServer = reader.ReadToEnd();//读取数据 reader.Close(); datastream.Close(); response.Close(); try { return XmlHelper.XmlDeserialize<T>(responseFromServer); } catch(Exception ex) { return resoult; } } } }
来一个最简单的demo
这个是一个通过序列化得到的xml文件
<?xml version="1.0" encoding="utf-8"?> <string>1</string>
同时附上我的github测试地址:“http://www.bobdong.cn/Software/CodeTest/Test.txt”
private string Load() { return WebData.LoadData<string>("http://www.bobdong.cn/Software/CodeTest/Test.txt", Encoding.UTF8); }
读出来的数据就是一个字符串了;
【ps:demo只是一个简单的例子,所以只放了一个string,其实也可以存放复杂类型的】
欢迎广大园友雅批指正
welcome to my page:www.bobdong.cn