以下链接有很大的启示
需求:
根据传参(参数验证)从给定的接口中获取数据(time参数),返回json格式数据
{"Data":[{"ID": xxx, "name":"pppp",
"rows":[{"2017-04-04 00:00:00":"nnn"},{"2017-04-04 01:00:00":"nnn"},{"2017-04-04 02:00:00":"nnn"}]
},
{"ID": xxxx, "name":"pppp",
"rows":[{"2017-04-04 00:00:00":"nnn"},{"2017-04-05 00:00:00":"nnn"},{"2017-04-06 00:00:00":"nnn"}]
}]}
简述步骤:
1.建立一般程序文件ashx;
1.继承于IHttpHandler;
2.自动生成的ProcessRequest(HttpContext context)方法,是入口方法;
3.context.Response.Write()方法用于输出数据,效果是会在页面上直接显示。
2.从接口中获取数据的思路;–从结果溯源
1.寻找”关键方法”;
2.从”关键方法”中获取关键的输入参数组成,如果组成是个易得到的现成方法就简单;如果不是就继续寻找:发现有参数来自整个方法体的形参,于是去寻找引用;
3.在引用中发现sql语句,由于不方便在引用项目中进行调试,于是将关键代码转移到现有项目中进行调试;
4.一步步溯源找到最原始的输入。
【或许有更好的方法论】
3.C# 关于时间的处理;
·关于计算时间差(C# TimeSpan 计算时间差(时间间隔))–注意:timespan.Hours统计的时间只会在24小时以内,而timespan.TotalHours单纯统计小时数。
/// <summary>
/// 将时间分割成每个时间段,组合成timeList
/// </summary>
/// <param name="endTime"></param>
/// <returns></returns>
private List<string> splitTime(DateTime endTime)
{
//input: 全局变量--1.split-间隔频率;2.range-总范围
List<string> timeList = new List<string>();
int rangeDayt = int.Parse(range);
int splitHourst = int.Parse(split);
DateTime beginTime = DateTime.Now.AddDays(-rangeDayt);
TimeSpan timeSpan = endTime.Subtract(beginTime).Duration();
int d_hours = (int)Math.Floor(timeSpan.TotalHours);//获取小时差
timeList.Add(beginTime.ToString("yyyy-MM-dd HH:mm:ss"));
for (int i = splitHourst; i < d_hours; i = i + splitHourst)
{
beginTime = beginTime.AddHours(splitHourst);
timeList.Add(beginTime.ToString("yyyy-MM-dd HH:mm:ss"));
}
timeList.Add(endTime.ToString("yyyy-MM-dd HH:mm:ss"));
return timeList;
}
·关于比较时间大小–转化成DateTime进行比较
http://www.cnblogs.com/jiangnini/archive/2013/11/26/3444001.html
#region 用tList来判断数据的时间范围
int[] recordNum = new int[tList.Count - 1];//根据时间节点定义计数器--这句话没什么意义
//初始化时间节点
for (int i = 0; i < recordNum.Length; i++)
{
data.rows.Add(tList[i], 0);
}
foreach (row r in sourceData.rows)//对其中一篇文章进行判断
{
DateTime tempDt = Convert.ToDateTime(r.updatetime);//转化为Datetime,再进行比较
string timeRecord = "";
#region 定义rows的时间
if (tempDt < Convert.ToDateTime(tList[0]))
{
continue ;
}
for (int i = 0; i < tList.Count; i++)
{
DateTime cdt = Convert.ToDateTime(tList[i]);
if (i == 0)
{
timeRecord = tList[i];
}
if (tempDt > cdt)
{
timeRecord = tList[i];
}
else
{
break;
}
}
#endregion
if (data.rows[timeRecord] != null)//如果存在已经定义的时间节点//关于如何从Dictionary中根据key获取value的数值
{
data.rows[timeRecord]++;
}
}
#endregion
4.关于json数据的读取和形成;
参考这篇文章:
http://bbs.csdn.net/topics/390520967
于是:
1.引用Newtonsoft.Json.dll(这个有个很棒的优点:可以只获取可以解析的部分,这样可以屏蔽不需要的信息);
2.构建实体类;可以实现key-value的读取 & 从model-class到json数据的转换;
SourceData sourceData = Newtonsoft.Json.JsonConvert.DeserializeObject<SourceData>(str);//从json格式转化成实体类;
resultJson = Newtonsoft.Json.JsonConvert.SerializeObject(resultData);//从实体类转化成json格式;
5.最后的URL访问:
http://localhost:9886/该ashx上级文件夹名称/一般应用程序名称.ashx?传参