HttpWebRequest WebClient给远程服务器上传数据; 未能创建 SSL/TLS 安全通道;JSON字符长度超出限制;
未能创建 SSL/TLS 安全通道,添加两句:
ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
WebClient给远程服务器上传数据
public void UploadDataWeatherHourly(List<WeatherHourly> list) { try { using (WebClient client = new WebClient()) { ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; var address = ""; address = System.Configuration.ConfigurationManager.AppSettings["UploadUrlHourly"]; client.Headers[HttpRequestHeader.ContentType] = "application/json"; client.Encoding = System.Text.Encoding.UTF8; //Encryption en = new Encryption(); //var list2 = new List<WeatherHourly>() { }; //for (int i = 0; i < 100; i++) //{ // list2.Add(list[i]); //} //var postData = en.ByteTo16(en.EncryptObjByte(list)); var data = new PostWeatherHourly { data = list }; string response1 = client.UploadString(address, JsonConvert.SerializeObject(data)); var result = JsonConvert.DeserializeObject<ResultModel>(response1); LogManage.Info("小时上传数量:" + list.Count.ToString()); LogManage.Info("小时入库成功数量:"+result.total.ToString()+" 返回信息:"+ result.msg); } } catch (Exception ex) { LogManage.Error("UploadDataWeatherHourly", ex); } }
C# MVC 控制器接收数据
[HttpPost] public JsonResult AddDataHourly(PostWeatherHourly obj) { ResultModel result = new Models.ResultModel(); var referer = Request.UrlReferrer; if (referer != null && referer.IsAbsoluteUri) { result.msg = "Referrer validate fail!"; return Json(result); } Encryption en = new Encryption(); try { //var temp = en.Str16ToByte(obj.data); //var list = en.DecryptObj<List<WeatherHourly>>(temp); //var num = WeatherHourlyAddRange(list); var num = WeatherHourlyAddRange(obj.data); result.msg = "AddDataHourly成功"; result.success = true; result.total = num; } catch (Exception ex) { result.msg = ex.Message; result.success = false; } return Json(result); } public int WeatherHourlyAddRange(List<WeatherHourly> weatherHourlyList) { int num = -1; using (var db = new EcologyServiceEntities()) { var tran = db.Database.BeginTransaction();//开启事务 try { db.WeatherHourly.AddRange(weatherHourlyList); if (weatherHourlyList.Count > 0) { num = db.SaveChanges(); tran.Commit(); //必须调用Commit(),不然数据不会保存 } } catch (Exception ex) { tran.Rollback(); //出错就回滚 //LogManage.Error("小时数据报错", ex); //若重复错误,则逐条遍历。 while (ex.InnerException != null) { ex = ex.InnerException; if (ex.Message.Contains("IX_")) { foreach (var myObj in weatherHourlyList) { try { using (var db3 = new EcologyServiceEntities()) { db3.WeatherHourly.Add(myObj); db3.SaveChanges(); } } catch (Exception ex2) { } } } } } } return num; }
数据接收类
public class PostWeatherHourly { public List<WeatherHourly> data { get; set; } } public class WeatherHourly { public int ID { get; set; } public Nullable<int> StationID { get; set; } public System.DateTime RecordDate { get; set; } public int DataHour { get; set; } public Nullable<double> Temperature { get; set; } public Nullable<double> AirPressure { get; set; } public Nullable<double> Rainfall { get; set; } public Nullable<double> RelativeHumidity { get; set; } public Nullable<double> AvgWind { get; set; } public string WindDir { get; set; } public Nullable<double> Visibility { get; set; } }
JSON字符长度超出限制;
<appSettings> <add key="aspnet:MaxJsonDeserializerMembers" value="150000000" /> </appSettings> <system.web.extensions> <scripting> <webServices> <jsonSerialization maxJsonLength="2147483644"/> </webServices> </scripting> </system.web.extensions>
未用上:HttpWebRequest方式比 WebClient功能更完善,更灵活,当然也更复杂。
/// <summary> /// 发送POST请求 /// </summary> /// <param name="url">请求URL</param> /// <param name="data">请求参数</param> /// <returns></returns> //static string HttpPost(string url, string data) //{ // HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url); // //字符串转换为字节码 // byte[] bs = Encoding.UTF8.GetBytes(data); // //参数类型,这里是json类型 // //还有别的类型如"application/x-www-form-urlencoded",不过我没用过(逃 // httpWebRequest.ContentType = "application/json"; // //参数数据长度 // httpWebRequest.ContentLength = bs.Length; // //设置请求类型 // httpWebRequest.Method = "POST"; // //设置超时时间 // httpWebRequest.Timeout = 20000; // //将参数写入请求地址中 // httpWebRequest.GetRequestStream().Write(bs, 0, bs.Length); // //发送请求 // HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); // //读取返回数据 // StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.UTF8); // string responseContent = streamReader.ReadToEnd(); // streamReader.Close(); // httpWebResponse.Close(); // httpWebRequest.Abort(); // return responseContent; //} ///// <summary> ///// 发送GET请求 ///// </summary> ///// <param name="url">请求URL,如果需要传参,在URL末尾加上“?+参数名=参数值”即可</param> ///// <returns></returns> //static string HttpGet(string url) //{ // //创建 // HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url); // //设置请求方法 // httpWebRequest.Method = "GET"; // //请求超时时间 // httpWebRequest.Timeout = 20000; // //发送请求 // HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); // //利用Stream流读取返回数据 // StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.UTF8); // //获得最终数据,一般是json // string responseContent = streamReader.ReadToEnd(); // streamReader.Close(); // httpWebResponse.Close(); // return responseContent; //}
加密部分省略。
1、不需要保密的数据,就加密一下 token 或 自定义的用户名、密码; 一般采用不可逆的MD5加密。
2、需要保密的数据:采用可逆的:RSA或AES加密 https://blog.csdn.net/huanhuanq1209/article/details/80614271
参考文档:
https://blog.csdn.net/rztyfx/article/details/110247593
https://q.cnblogs.com/q/98826/
http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
树立目标,保持活力,gogogo!