Light12306/ChatRoomServer.Www/Areas/Web/Controllers/Cn12306Controller.cs

268 lines
7.6 KiB
C#
Raw Normal View History

namespace ChatRoomServer.Www.Areas.Web.Controllers
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Caching;
using System.Web.Mvc;
using ChatRoomServer.Www.Areas.Web.Models;
using ChatRoomServer.Www.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
[AllowAnonymous]
public class Cn12306Controller : Controller
{
static string[] _invalidIpStart = new[] { "0.", "127.", "192." };
static bool _enabled = true;
static bool IsValidIp(string ip)
{
if (ip.IsNullOrEmpty())
return false;
if (_invalidIpStart.Any(s => ip.StartsWith(s)))
return false;
if (!System.Text.RegularExpressions.Regex.IsMatch(ip, @"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"))
return false;
return true;
}
public ActionResult IpService(string id)
{
var resultCacheKey1 = "cn12306servercache1";
var resultCacheKey2 = "cn12306servercache2";
if (id == "toggleenabled")
{
_enabled = !_enabled;
return Json(new { success = _enabled, message = "ok" }, JsonRequestBehavior.AllowGet);
}
if (!_enabled)
return Json(new { success = _enabled, message = "server maintenance" }, JsonRequestBehavior.AllowGet);
if (id == "count")
{
return JsonCamel(new { Serve = MvcApplication.HostResolveCache.ServeCount, Update = MvcApplication.HostResolveCache.UpdateCount });
}
if (id == "get")
{
var data = System.Web.HttpRuntime.Cache[resultCacheKey1] as string;
if (data == null)
{
data = Newtonsoft.Json.JsonConvert.SerializeObject(MvcApplication.HostResolveCache.HostMap.GetValue("dynamic.12306.cn").Values.ToArray(), new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
System.Web.HttpRuntime.Cache.Add(resultCacheKey1, data, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 20, 0), CacheItemPriority.Normal, null);
}
MvcApplication.HostResolveCache.ServeCount++;
return Content(data, "application/json");
}
if (id == "getall")
{
return Json2(new string[0]);
}
if (id == "getlist")
{
var data = System.Web.HttpRuntime.Cache[resultCacheKey2] as string;
if (data == null)
{
data = Newtonsoft.Json.JsonConvert.SerializeObject(MvcApplication.HostResolveCache.HostMap.Values.SelectMany(s => s.Values).ToArray(), new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
System.Web.HttpRuntime.Cache.Add(resultCacheKey2, data, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 20, 0), CacheItemPriority.Normal, null);
}
MvcApplication.HostResolveCache.ServeCount++;
return Content(data, "application/json");
}
if (id == "update")
{
var content = Request.Form["data"];
var report = Newtonsoft.Json.JsonConvert.DeserializeObject<ServerIp[]>(content);
var host = "dynamic.12306.cn";
var ips = MvcApplication.HostResolveCache.HostMap.GetValue(host, _ => new Dictionary<string, HostResolve>());
report.ForEach(s =>
{
if (!IsValidIp(s.Ip)) return;
var ip = s.Ip;
if (!ips.ContainsKey(ip) && s.AverageSpeed <= 0)
return;
var m = ips.GetValue(ip, _ => new HostResolve() { Ip = _, AddTime = DateTime.Now, Host = host });
if (s.AverageSpeed == -1) m.FailedCount++;
else if (s.AverageSpeed == -2) m.BrokenCount++;
else if (s.AverageSpeed > 0)
{
m.ValidCount++;
if (s.AverageSpeed > 0)
{
m.AverageSpeed = (int)((m.AverageSpeed * 1.0 * m.SpeedCount + s.AverageSpeed) / (m.SpeedCount + 1));
m.SpeedCount++;
}
}
var datacache = Newtonsoft.Json.JsonConvert.SerializeObject(ips.Values.ToArray(), new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
System.Web.HttpRuntime.Cache.Add(resultCacheKey1, datacache, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 20, 0), CacheItemPriority.Normal, null);
});
MvcApplication.HostResolveCache.UpdateCount++;
return Content("update success, thanks.");
}
if (id == "update2")
{
var keyes = new[] {
"dynamic.12306.cn",
"kyfw.12306.cn"//,
//"www.12306.cn"
};
foreach (var host in keyes)
{
var data = Request.Form[host];
if (data.IsNullOrEmpty())
continue;
var report = Newtonsoft.Json.JsonConvert.DeserializeObject<ServerIp[]>(data);
if (report == null)
continue;
var ips = MvcApplication.HostResolveCache.HostMap.GetValue(host, h => new Dictionary<string, HostResolve>());
foreach (var s in report)
{
if (!IsValidIp(s.Ip))
continue;
var ip = s.Ip;
if (!ips.ContainsKey(ip) && s.AverageSpeed <= 0)
continue;
var m = ips.GetValue(ip, _ => new HostResolve() { Ip = _, AddTime = DateTime.Now, Host = host });
if (s.AverageSpeed == -1)
m.FailedCount++;
else if (s.AverageSpeed == -2)
m.BrokenCount++;
else if (s.AverageSpeed > 0)
{
m.ValidCount++;
if (s.AverageSpeed > 0)
{
m.AverageSpeed = (int)((m.AverageSpeed * 1.0 * m.SpeedCount + s.AverageSpeed) / (m.SpeedCount + 1));
m.SpeedCount++;
}
}
}
}
System.Web.HttpRuntime.Cache.Remove(resultCacheKey2);
MvcApplication.HostResolveCache.UpdateCount++;
return Content("succeed.");
}
//if (id == "log")
//{
// var ctx = new DbContext();
// var keyes = new[] { "dynamic.12306.cn", "kyfw.12306.cn", "www.12306.cn" };
// foreach (var key in keyes)
// {
// var ip = Request.Form[key];
// if (!IsValidIp(ip))
// continue;
// if (ctx.HostResolve.Any(s => s.Host == key && s.Ip == ip))
// continue;
// ctx.HostResolve.Add(new HostResolve()
// {
// Host = key,
// Ip = ip,
// AddTime = DateTime.Now
// });
// }
// ctx.SaveChanges();
// return Content("update success, thanks.");
//}
if (id == "refreshcache")
{
var target = new[] { resultCacheKey1, resultCacheKey2 };
foreach (var key in target)
{
try
{
HttpRuntime.Cache.Remove(key);
}
catch (Exception)
{
}
}
}
if (id == "raw")
{
return Json(MvcApplication.HostResolveCache);
}
return null;
}
/// <summary>
/// 生成并返回一个Json结果
/// </summary>
/// <param name="data">数据</param>
/// <param name="contentType">结果类型</param>
/// <param name="jsCallback">JSONP回调函数名</param>
/// <param name="encoding">内容编码</param>
/// <returns>返回一个ActionResult结果</returns>
protected ActionResult Json2(object data, string contentType = null, string jsCallback = null, Encoding encoding = null)
{
return new Json2Result
{
ContentEncoding = encoding,
ContentType = contentType,
Data = data,
CallbackJsFunction = jsCallback
};
}
/// <summary>
/// 生成并返回一个Json结果
/// </summary>
/// <param name="data">数据</param>
/// <param name="contentType">结果类型</param>
/// <param name="jsCallback">JSONP回调函数名</param>
/// <param name="encoding">内容编码</param>
/// <returns>返回一个ActionResult结果</returns>
protected ActionResult JsonCamel(object data, string contentType = null, string jsCallback = null, Encoding encoding = null, bool indent = false)
{
return new Json2Result
{
ContentEncoding = encoding,
ContentType = contentType,
Data = data,
CallbackJsFunction = jsCallback,
Indent = indent,
UseCamelName = true
};
}
}
}