windows服务获取天气存储

日期:2016-1-25 20:54 | 标签: 百度天气 windows服务 json序列化 | 阅读:587

Windows 服务是可长时间运行的可执行应用程序,不显示任何用户界面,非常适合在服务器上使用。

写windows服务

在visual studio中新建项目,在visual c#-->windows选项卡下则可以发现“windows服务”,选中,输入名称,创建项目即可。会自动生成一个windows服务项目。

服务程序默认继承自ServiceBase,需要重写OnStart、OnStop两个方法,业务逻辑写在OnStart方法中。我的需求是定时获取天气数据并存储,c#的timer可以派上用场了,需要注意的是,事件并不会立即触发,第一次触发的时间是启动服务后的Interval 毫秒。

System.Timers.Timer t = new System.Timers.Timer();
//  一小时获取一次天气
t.Interval =60 * 60000; 
//到达时间的时候执行事件; 
t.Elapsed += new System.Timers.ElapsedEventHandler(ChkHour);
// 执行一次(false)还是一直执行(true); 
t.AutoReset = true;
// 是否执行System.Timers.Timer.Elapsed事件; 
t.Enabled = true;

到点时会触发ChkHour,部分代码如下:

try {
    System.Timers.Timer tt = (System.Timers.Timer)source;
     tt.Enabled = false;
     // 开始执行业务
     businessStart();
     tt.Enabled = true;
}
catch (Exception err) {
      //写日志 
      writestr(err.Message+":"+err.StackTrace); 
}

当关键事件发生或者程序异常发生时,可以将其写到系统事件日志中,直接使用 :

EventLog.WriteEntry("你的消息");

我们更希望的是自定义消息类型,如是新建一个文本文件,将自定义消息写进文本文件中,参考代码:

StreamWriter dout = new StreamWriter(@"c:\" + "文件名.txt", true);
dout.Write("\r\n事件:" + readme + "\r\n时间:" + DateTime.Now.ToString("MM-dd HH:mm:ss"));
dout.Close();

至此,一个大概的轮廓出来,接下来要做的是实现业务了。

windows服务安装、启动、卸载

打开CMD,进入到.Net安装目录。
我的是: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319

// 安装
installutil 服务名.exe  
// 卸载
installutil /u 服务名.exe  
// 启动
net start 服务名  
// 停止
net stop 服务名

百度世界天气api

百度世界天气api每日可调用10000次,api返回为json字符串(jsonsStr),引入 System.Web.Script.Serialization,使用如下方法进行处理,引用之前需要添加System.Web.Extensions.dll的引用。下列代码搞这么复杂,真佩服自己,应该还有更简单的办法。

// 处理jsonsStr
JavaScriptSerializer serializer = new JavaScriptSerializer();
// 转化为键值对
Dictionary<string, object> json = serializer.DeserializeObject(jsonsStr) as Dictionary<string, object>;
 List<Object> list_obj = json["HeWeather data service 3.0"] as List<Object>;
Dictionary<string, object> jsonArr= ((object[])(json["HeWeather data service 3.0"]))[0] as Dictionary<string, object>;
// now 为实时天气
Dictionary<string, object> weatherNow= jsonArr["now"] as Dictionary<string, object>;
// 存储
storeWeatherNow(weatherNow);

ps: 附上百度天气api的c#案例代码:

string param = "city=" + cityname;
string strURL = url + '?' + param;
System.Net.HttpWebRequest request;
request = (System.Net.HttpWebRequest)WebRequest.Create(strURL);
request.Method = "GET";
// 添加header
request.Headers.Add("apikey", apiKey);
System.Net.HttpWebResponse response;
response = (System.Net.HttpWebResponse)request.GetResponse();
System.IO.Stream s;
s = response.GetResponseStream();
string StrDate = "";
string jsonsStr= "";
StreamReader Reader = new StreamReader(s, Encoding.UTF8);
while ((StrDate = Reader.ReadLine()) != null)
{
      jsonsStr+= StrDate;//+ "\r\n"
}

版权声明: 署名-非商业性使用-禁止演绎 4.0 国际(CC BY-NC-ND 4.0
Copyright ©2013-2017 | 粤ICP备14081691号 | yipeng手工打造 | 联系方式