using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Winsoft.GOV.XF.WebApi.WXCore.Models;
using Newtonsoft.Json;
using Winsoft.GOV.XF.WebApi.WXCore.Data;
using Microsoft.Extensions.Logging;
using System.Net;
namespace Winsoft.GOV.XF.WebApi.WXCore.Services
{
public class XFApiService : BaseService
{
public delegate void OnFails(string message);
BundlesService _bundlesService;
public XFApiService(BundlesService bundlesService, XFDbContext context, ILoggerFactory loggerFactory):base(context, loggerFactory)
{
_bundlesService = bundlesService;
}
///
/// 提交信件
///
/// 信件内容
/// 失败回调
///
public async Task PostLetter(Bundle b, string absoluteUri, OnFails onFails)
{
string d = b.Describe;
if (b.Assets.Count() > 0)
d += "(此信件内容含有其他多媒体信息,详细请复制网址到浏览器打开:" + _bundlesService.GenerateBaseURL(b, absoluteUri) + ")";
string s = "advice={0};type={1};name={2};phone={3};is_public={4};content={5};title={6};county_id={7};unit_id={8};sswz=8;ly=2; user_id={9}";
s = String.Format(s, b.Advice, b.Type.ToString(), b.Name, b.Mobile, b.IsPublic.ToString(), d, b.Title, b.County_id, b.Unit_id, b.OpenID);
XFApiResult rObj = await HttpPostAsync("http://118.178.118.50/test1/letter/submitLetter;", s, onFails);
if (rObj == null)
return false;
if (rObj.Data == null || !rObj.Data.Success)
{
Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
return false;
}
b.SearchCode = rObj.Data.Data;
_bundlesService.Update(b);
return true;
//if (rObj != null)
//{
// b.SearchCode = rObj.Data.Data;
// return true;
//}
//return false;
}
///
/// 查询码是否有效
///
/// 查询码
/// 失败回调
///
public async Task QueryCodeIsValid(string queryCode, OnFails onFails)
{
XFApiResult rObj = await HttpPostAsync("http://<服务器IP>/query/code;", "query_code=" + queryCode, onFails);
if (rObj == null)
return false;
if (rObj.Data == null || !rObj.Data.Success)
{
Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
return false;
}
return true;
}
///
/// 查询信件详细信息
///
/// 查询码
/// 失败回调
///
public async Task GetBundleByQueryCode(string queryCode, OnFails onFails)
{
XFApiResult rObj = await HttpPostAsync("http://<服务器IP>/query/letterDetail;", "query_code="+ queryCode, onFails);
if (rObj == null)
return null;
if (rObj.Data == null || !rObj.Data.Success)
{
Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
return null;
}
Bundle bundle = new Bundle();
return bundle;
}
///
/// 是否可评价
///
///
///
///
public async Task IsEvaluate(string letter_id, OnFails onFails)
{
XFApiIsEvaluateResult rObj = await HttpPostAsync("http://<服务器IP>/query/letterDetail;", "letter_id=" + letter_id, onFails);
if (rObj == null)
return false;
if (rObj.Data == null)
{
Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
return false;
}
return rObj.Data.SFKPJ;
}
///
/// 评价
///
///
///
///
//http://<服务器IP>/query/submitEvaluate
public async Task SubmitEvaluate(EvaluateModel e, OnFails onFails)
{
//Dictionary d = e.ToDictionary();
//XFApiResult rObj = await HttpPostAsync("http://<服务器IP>/query/letterDetail", d, onFails);
//if (rObj == null)
// return false;
//if (rObj.Data == null || !rObj.Data.Success)
//{
// Logger.LogError("数据提交省统一平台失败,原因:{0}", rObj.Message);
// onFails(string.Format("数据提交省统一平台失败,原因:{0}", rObj.Message));
// return false;
//}
return true;
}
///
/// POST 异步
///
///
///
///
///
///
async Task HttpPostAsync(string url, string formData, OnFails onFails)
{
HttpClientHandler handler = new HttpClientHandler();
HttpClient client = new HttpClient(handler);
MemoryStream ms = new MemoryStream();
HttpContent hc = new StreamContent(ms);
hc.Headers.Add("APIKey", "MUA5NmU3OTIxOEPSOFTDQ1YTMzMDExMg");
var r = await client.PostAsync(url + WebUtility.UrlEncode(formData), hc);
if (r.StatusCode != HttpStatusCode.OK)
{
Logger.LogError("省统一平台异常反馈:状态“{0}”", r.StatusCode);
onFails(string.Format("省统一平台异常反馈:状态“{0}”", r.StatusCode));
return default(T);
}
byte[] tmp = await r.Content.ReadAsByteArrayAsync();
string rStr = Encoding.UTF8.GetString(tmp);
T rObj = JsonConvert.DeserializeObject(rStr);
if (rObj == null)
{
Logger.LogError("数据提交省统一平台失败,原因:{0}", "数据为空");
onFails(string.Format("数据提交省统一平台失败,原因:{0}", "数据为空"));
return default(T);
}
return rObj;
}
///
/// POST 同步
///
///
///
///
///
///
string HttpPost(string url, Dictionary formData = null, Encoding encoding = null, int timeOut = 10000)
{
HttpClientHandler handler = new HttpClientHandler();
HttpClient client = new HttpClient(handler);
MemoryStream ms = new MemoryStream();
FillFormDataStream(formData, ms);//填充formData
HttpContent hc = new StreamContent(ms);
//client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));
//client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xhtml+xml"));
//client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml", 0.9));
//client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("image/webp"));
//client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*", 0.8));
//hc.Headers.Add("UserAgent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36");
//hc.Headers.Add("Timeout", timeOut.ToString());
//hc.Headers.Add("KeepAlive", "true");
var t = client.PostAsync(url, hc);
t.Wait();
var t2 = t.Result.Content.ReadAsByteArrayAsync();
return encoding.GetString(t2.Result);
}
///
/// 组装QueryString的方法
/// 参数之间用&连接,首位没有符号,如:a=1&b=2&c=3
///
///
///
string GetQueryString(Dictionary formData)
{
if (formData == null || formData.Count == 0)
{
return "";
}
StringBuilder sb = new StringBuilder();
var i = 0;
foreach (var kv in formData)
{
i++;
sb.AppendFormat("{0}={1}", kv.Key, kv.Value);
if (i < formData.Count)
{
sb.Append("&");
}
}
return sb.ToString();
}
///
/// 填充表单信息的Stream
///
///
///
void FillFormDataStream(Dictionary formData, Stream stream)
{
string dataString = GetQueryString(formData);
var formDataBytes = formData == null ? new byte[0] : Encoding.UTF8.GetBytes(dataString);
stream.Write(formDataBytes, 0, formDataBytes.Length);
stream.Seek(0, SeekOrigin.Begin);//设置指针读取位置
}
}
}