using Newtonsoft.Json.Linq;
|
using System;
|
using System.Collections.Generic;
|
using System.Configuration;
|
using System.IO;
|
using System.Net;
|
using System.Net.Security;
|
using System.Text;
|
using XImaging.Automation.Library.HxDriverLib;
|
|
namespace XImaging.Automation.Service
|
{
|
public class PostServerConfig : ConfigurationElement
|
{
|
[ConfigurationProperty("name", IsRequired = true)]
|
public string Name
|
{
|
get { return (string)this["name"]; }
|
}
|
|
[ConfigurationProperty("method", IsRequired = true)]
|
public string Method
|
{
|
get { return (string)this["method"]; }
|
}
|
|
[ConfigurationProperty("uri", IsRequired = true)]
|
public string URI
|
{
|
get { return (string)this["uri"]; }
|
}
|
}
|
|
public class PostServerSection : ConfigurationSection
|
{
|
[ConfigurationProperty("server", IsRequired = true)]
|
public PostServerConfig Server
|
{
|
get { return this["server"] as PostServerConfig; }
|
}
|
}
|
|
public class MessageConfig : ConfigurationElement
|
{
|
[ConfigurationProperty("enabled", IsRequired = true)]
|
public bool Enabled
|
{
|
get { return (bool)this["enabled"]; }
|
}
|
|
[ConfigurationProperty("timeout", IsRequired = true)]
|
public int Timeout
|
{
|
get { return (int)this["timeout"]; }
|
}
|
}
|
|
public class MessageSection : ConfigurationSection
|
{
|
[ConfigurationProperty("heartbeat", IsRequired = true)]
|
public MessageConfig Heartbeat
|
{
|
get { return this["heartbeat"] as MessageConfig; }
|
}
|
}
|
|
public class HttpRequestClient
|
{
|
/// <summary>
|
/// 获取或设置数据字符编码, 默认使用<see cref="System.Text.Encoding.UTF8"/>
|
/// </summary>
|
public Encoding Encoding { get; set; } = Encoding.UTF8;
|
|
/// <summary>
|
/// 获取或设置 UserAgent
|
/// </summary>
|
public string UserAgent { get; set; } = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36";
|
|
/// <summary>
|
/// 获取或设置 Accept
|
/// </summary>
|
public string Accept { get; set; } = "*/*";
|
|
/// <summary>
|
/// 获取或设置 Referer
|
/// </summary>
|
public string Referer { get; set; }
|
|
/// <summary>
|
/// 获取或设置 Cookie 容器
|
/// </summary>
|
public CookieContainer CookieContainer { get; set; } = new CookieContainer();
|
|
public virtual string Post(string url)
|
{
|
return null;
|
}
|
/// <summary>
|
/// 初始化一个用于以 POST 方式向目标地址提交不包含文件表单数据<see cref="HttpPostRequestClient"/>实例
|
/// </summary>
|
public HttpRequestClient()
|
{
|
}
|
}
|
|
internal sealed class BiosenHttpRequestClient : HttpRequestClient
|
{
|
public static string Uri { set; get; }
|
|
private JObject _postDatas;
|
private static string SO_DELIMITER = "#!HxSEP!#";
|
private string m_strName;
|
private string m_strPayload;
|
|
public static void Init()
|
{
|
PostServerSection section = ConfigurationManager.GetSection("dataServer") as PostServerSection;
|
BiosenHttpRequestClient.Uri = section.Server.URI;
|
}
|
|
public BiosenHttpRequestClient() : base()
|
{
|
this._postDatas = JObject.FromObject(new { });
|
}
|
|
/// <summary>
|
/// 以POST方式向目标地址提交表单数据
|
/// </summary>
|
/// <param name="url">目标地址, http(s)://sample.com</param>
|
/// <returns>目标地址的响应</returns>
|
public override string Post(string url)
|
{
|
if (string.IsNullOrWhiteSpace(url))
|
throw new ArgumentNullException(nameof(url));
|
|
HttpWebRequest request = null;
|
if (url.ToLowerInvariant().StartsWith("https"))
|
{
|
request = WebRequest.Create(url) as HttpWebRequest;
|
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((s, c, ch, ss) => { return true; });
|
request.ProtocolVersion = HttpVersion.Version11;
|
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
|
request.KeepAlive = true;
|
ServicePointManager.CheckCertificateRevocationList = true; ServicePointManager.DefaultConnectionLimit = 100;
|
ServicePointManager.Expect100Continue = false;
|
}
|
else
|
{
|
request = WebRequest.Create(url) as HttpWebRequest;
|
}
|
|
request.Timeout = 3000;
|
request.Method = "POST";
|
request.ContentType = "application/json";
|
request.UserAgent = this.UserAgent;
|
request.Accept = this.Accept;
|
request.Referer = this.Referer;
|
request.CookieContainer = this.CookieContainer;
|
|
string postData = this._postDatas.ToString();
|
try
|
{
|
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
|
{
|
streamWriter.Write(postData);
|
}
|
}
|
catch(Exception ex)
|
{
|
LogConstant.logger.Print(string.Format("[Post][Exception]{0}", ex.ToString()));
|
}
|
|
LogConstant.logger.Print(string.Format("[Post][Data]准备向[{0}]发送消息: {1}", url, postData));
|
string resContent = "";
|
try
|
{
|
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
|
using (Stream resStream = response.GetResponseStream())
|
{
|
using (StreamReader streamReader = new StreamReader(resStream, Encoding.UTF8))
|
{
|
resContent = streamReader.ReadToEnd().ToString();
|
}
|
}
|
|
LogConstant.logger.Print(string.Format("[Post][Data]消息发送成功,从[{0}]收到返回消息: {1}", url, resContent));
|
return resContent;
|
}
|
catch (Exception ex)
|
{
|
LogConstant.logger.Print("[Post][Data]消息发送失败,未收到返回消息:" + ex.Message);
|
throw ex;
|
}
|
}
|
|
public static void Send(string data)
|
{
|
BiosenHttpRequestClient client = new BiosenHttpRequestClient();
|
client.Payload = data;
|
string t_response = client.Post(BiosenHttpRequestClient.Uri + "?name=" + client.m_strName);
|
return;
|
}
|
|
public string Payload
|
{
|
set
|
{
|
this.m_strPayload = value;
|
this.m_strName = XImaging.Automation.Library.HxDriverLib.Encrypt.md5(this.m_strPayload + SO_DELIMITER);
|
this._postDatas = JObject.Parse(this.m_strPayload);
|
}
|
get
|
{
|
return m_strPayload;
|
}
|
}
|
}
|
|
internal sealed class BiosenErrorRequestClient : HttpRequestClient
|
{
|
public static string Uri { set; get; }
|
|
private JObject _postDatas;
|
private static string SO_DELIMITER = "#!HxSEP!#";
|
private string m_strName;
|
private string m_strPayload;
|
|
public static void Init()
|
{
|
PostServerSection section = ConfigurationManager.GetSection("errorServer") as PostServerSection;
|
BiosenErrorRequestClient.Uri = section.Server.URI;
|
}
|
|
public BiosenErrorRequestClient() : base()
|
{
|
this._postDatas = JObject.FromObject(new { });
|
}
|
|
/// <summary>
|
/// 以POST方式向目标地址提交表单数据
|
/// </summary>
|
/// <param name="url">目标地址, http(s)://sample.com</param>
|
/// <returns>目标地址的响应</returns>
|
public override string Post(string url)
|
{
|
if (string.IsNullOrWhiteSpace(url))
|
throw new ArgumentNullException(nameof(url));
|
|
HttpWebRequest request = null;
|
if (url.ToLowerInvariant().StartsWith("https"))
|
{
|
request = WebRequest.Create(url) as HttpWebRequest;
|
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((s, c, ch, ss) => { return true; });
|
request.ProtocolVersion = HttpVersion.Version11;
|
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
|
request.KeepAlive = true;
|
ServicePointManager.CheckCertificateRevocationList = true; ServicePointManager.DefaultConnectionLimit = 100;
|
ServicePointManager.Expect100Continue = false;
|
}
|
else
|
{
|
request = WebRequest.Create(url) as HttpWebRequest;
|
}
|
|
request.Timeout = 3000;
|
request.Method = "POST";
|
request.ContentType = "application/json";
|
request.UserAgent = this.UserAgent;
|
request.Accept = this.Accept;
|
request.Referer = this.Referer;
|
request.CookieContainer = this.CookieContainer;
|
|
string postData = this._postDatas.ToString();
|
try
|
{
|
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
|
{
|
streamWriter.Write(postData);
|
}
|
}
|
catch (Exception ex)
|
{
|
LogConstant.logger.Print("[Post][Exception]" + ex.ToString());
|
}
|
|
LogConstant.logger.Print(string.Format("[Post][Error]准备向[{0}]发送错误消息: {1}", url, postData));
|
string resContent = "";
|
try
|
{
|
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
|
using (Stream resStream = response.GetResponseStream())
|
{
|
using (StreamReader streamReader = new StreamReader(resStream, Encoding.UTF8))
|
{
|
resContent = streamReader.ReadToEnd().ToString();
|
}
|
}
|
|
LogConstant.logger.Print(string.Format("[Post][Error]错误消息发送成功,从[{0}]收到返回消息: {1}", url, resContent));
|
return resContent;
|
}
|
catch(Exception ex)
|
{
|
LogConstant.logger.Print("[Post][Error]错误消息发送失败,未收到返回消息:" + ex.Message);
|
throw ex;
|
}
|
}
|
|
public static void Send(string data)
|
{
|
BiosenErrorRequestClient client = new BiosenErrorRequestClient();
|
client.Payload = data;
|
string t_response = client.Post(BiosenErrorRequestClient.Uri + "?name=" + client.m_strName);
|
return;
|
}
|
|
public string Payload
|
{
|
set
|
{
|
this.m_strPayload = value;
|
this.m_strName = XImaging.Automation.Library.HxDriverLib.Encrypt.md5(this.m_strPayload + SO_DELIMITER);
|
this._postDatas = JObject.Parse(this.m_strPayload);
|
}
|
get
|
{
|
return m_strPayload;
|
}
|
}
|
}
|
|
public class UploadParameterType
|
{
|
public UploadParameterType()
|
{
|
Encoding = Encoding.UTF8;
|
PostParameters = new Dictionary<string, string>();
|
}
|
/// <summary>
|
/// 上传地址
|
/// </summary>
|
public string Url { get; set; }
|
/// <summary>
|
/// 文件名称key
|
/// </summary>
|
public string FileName { get; set; }
|
/// <summary>
|
/// 编码格式
|
/// </summary>
|
public Encoding Encoding { get; set; }
|
/// <summary>
|
/// 上传文件的流
|
/// </summary>
|
public Stream UploadStream { get; set; }
|
/// <summary>
|
/// 上传文件 携带的参数集合
|
/// </summary>
|
public IDictionary<string, string> PostParameters { get; set; }
|
}
|
|
public class BiosenFileRequestClient : HttpRequestClient
|
{
|
public static string Uri { set; get; }
|
|
private UploadParameterType parameters;
|
public static void Init()
|
{
|
PostServerSection section = ConfigurationManager.GetSection("fileServer") as PostServerSection;
|
BiosenFileRequestClient.Uri = section.Server.URI;
|
}
|
|
public override string Post(string url)
|
{
|
if (string.IsNullOrWhiteSpace(url))
|
throw new ArgumentNullException(nameof(url));
|
|
string boundary = DateTime.Now.Ticks.ToString("x"); // 边界符
|
byte[] beginBoundaryBytes = Encoding.UTF8.GetBytes("--" + boundary + "\r\n");
|
byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
|
byte[] newLineBytes = Encoding.UTF8.GetBytes("\r\n");
|
|
MemoryStream memoryStream = new MemoryStream();
|
if (this.parameters.PostParameters != null && parameters.PostParameters.Count > 0)
|
{
|
foreach (KeyValuePair<string, string> keyValuePair in parameters.PostParameters)
|
{
|
string parameterHeaderTemplate = string.Format("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n", keyValuePair.Key, keyValuePair.Value);
|
byte[] parameterHeaderBytes = parameters.Encoding.GetBytes(parameterHeaderTemplate);
|
|
memoryStream.Write(beginBoundaryBytes, 0, beginBoundaryBytes.Length);
|
memoryStream.Write(parameterHeaderBytes, 0, parameterHeaderBytes.Length);
|
}
|
}
|
|
const string filePartHeaderTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
|
"Content-Type: application/octet-stream\r\n\r\n";
|
int i = 0;
|
|
if (this.parameters.FileName != null)
|
{
|
FileInfo fileInfo = new FileInfo(this.parameters.FileName);
|
string fileName = fileInfo.Name;
|
|
string fileHeaderItem = string.Format(filePartHeaderTemplate, "files", fileName);
|
byte[] fileHeaderItemBytes = Encoding.UTF8.GetBytes(fileHeaderItem);
|
|
if (i > 0)
|
{
|
memoryStream.Write(newLineBytes, 0, newLineBytes.Length);
|
}
|
memoryStream.Write(beginBoundaryBytes, 0, beginBoundaryBytes.Length);
|
memoryStream.Write(fileHeaderItemBytes, 0, fileHeaderItemBytes.Length);
|
|
int bytesRead;
|
byte[] buffer = new byte[1024];
|
|
FileStream fileStream = new FileStream(this.parameters.FileName, FileMode.Open, FileAccess.Read);
|
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
|
{
|
memoryStream.Write(buffer, 0, bytesRead); // 2.3 将文件流写入FormData项中
|
}
|
|
i++;
|
}
|
|
memoryStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
|
|
HttpWebRequest request = null;
|
if (url.ToLowerInvariant().StartsWith("https"))
|
{
|
request = WebRequest.Create(url) as HttpWebRequest;
|
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((s, c, ch, ss) => { return true; });
|
request.ProtocolVersion = HttpVersion.Version11;
|
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
|
request.KeepAlive = true;
|
ServicePointManager.CheckCertificateRevocationList = true; ServicePointManager.DefaultConnectionLimit = 100;
|
ServicePointManager.Expect100Continue = false;
|
}
|
else
|
{
|
request = WebRequest.Create(url) as HttpWebRequest;
|
}
|
|
request.Timeout = 10000;
|
request.Method = "POST";
|
request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
|
request.UserAgent = this.UserAgent;
|
request.Accept = this.Accept;
|
request.Referer = this.Referer;
|
request.ContentLength = memoryStream.Length;
|
request.CookieContainer = this.CookieContainer;
|
|
memoryStream.Position = 0;
|
byte[] tempBuffer = new byte[memoryStream.Length];
|
memoryStream.Read(tempBuffer, 0, tempBuffer.Length);
|
memoryStream.Close();
|
|
using (var streamWriter = request.GetRequestStream())
|
{
|
streamWriter.Write(tempBuffer, 0, tempBuffer.Length);
|
}
|
|
string resContent = "";
|
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
|
using (Stream resStream = response.GetResponseStream())
|
{
|
using (StreamReader streamReader = new StreamReader(resStream, Encoding.UTF8))
|
{
|
resContent = streamReader.ReadToEnd().ToString();
|
}
|
}
|
|
return resContent;
|
}
|
|
public static string Send(UploadParameterType parameters)
|
{
|
BiosenFileRequestClient client = new BiosenFileRequestClient();
|
client.parameters = parameters;
|
LogConstant.logger.Print(string.Format("[Post][File]准备上传文件[{0}]到数据服务器", parameters.FileName));
|
string t_response = client.Post(BiosenFileRequestClient.Uri);
|
JObject res = JObject.Parse(t_response);
|
if (res["status"].ToString().Equals("0"))
|
{
|
string url = res["data"].ToString();
|
LogConstant.logger.Print(string.Format("[Post][File]文件上传到数据服务器的保存地址:[{0}]", t_response));
|
return url;
|
}
|
else
|
{
|
LogConstant.logger.Print(string.Format("[Post][File]文件上传数据服务器失败:{0}", res["message"].ToString()));
|
throw new Exception(res["message"].ToString());
|
}
|
}
|
}
|
|
internal sealed class BiosenBatchFilesRequestClient : HttpRequestClient
|
{
|
public static string Uri { set; get; }
|
|
private UploadParameterType parameters;
|
public static void Init()
|
{
|
PostServerSection section = ConfigurationManager.GetSection("fileServer") as PostServerSection;
|
BiosenBatchFilesRequestClient.Uri = section.Server.URI;
|
}
|
|
public override string Post(string url)
|
{
|
if (string.IsNullOrWhiteSpace(url))
|
throw new ArgumentNullException(nameof(url));
|
|
string boundary = DateTime.Now.Ticks.ToString("x"); // 边界符
|
byte[] beginBoundaryBytes = Encoding.UTF8.GetBytes("--" + boundary + "\r\n");
|
byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
|
byte[] newLineBytes = Encoding.UTF8.GetBytes("\r\n");
|
|
MemoryStream memoryStream = new MemoryStream();
|
if (this.parameters.PostParameters != null && parameters.PostParameters.Count > 0)
|
{
|
foreach (KeyValuePair<string, string> keyValuePair in parameters.PostParameters)
|
{
|
string parameterHeaderTemplate = string.Format("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n", keyValuePair.Key, keyValuePair.Value);
|
byte[] parameterHeaderBytes = parameters.Encoding.GetBytes(parameterHeaderTemplate);
|
|
memoryStream.Write(beginBoundaryBytes, 0, beginBoundaryBytes.Length);
|
memoryStream.Write(parameterHeaderBytes, 0, parameterHeaderBytes.Length);
|
}
|
}
|
|
const string filePartHeaderTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
|
"Content-Type: application/octet-stream\r\n\r\n";
|
int i = 0;
|
|
if (this.parameters.FileName != null)
|
{
|
FileInfo fileInfo = new FileInfo(this.parameters.FileName);
|
string fileName = fileInfo.Name;
|
|
string fileHeaderItem = string.Format(filePartHeaderTemplate, "files", fileName);
|
byte[] fileHeaderItemBytes = Encoding.UTF8.GetBytes(fileHeaderItem);
|
|
if (i > 0)
|
{
|
memoryStream.Write(newLineBytes, 0, newLineBytes.Length);
|
}
|
memoryStream.Write(beginBoundaryBytes, 0, beginBoundaryBytes.Length);
|
memoryStream.Write(fileHeaderItemBytes, 0, fileHeaderItemBytes.Length);
|
|
int bytesRead;
|
byte[] buffer = new byte[1024];
|
|
FileStream fileStream = new FileStream(this.parameters.FileName, FileMode.Open, FileAccess.Read);
|
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
|
{
|
memoryStream.Write(buffer, 0, bytesRead); // 2.3 将文件流写入FormData项中
|
}
|
|
i++;
|
}
|
|
memoryStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
|
|
HttpWebRequest request = null;
|
if (url.ToLowerInvariant().StartsWith("https"))
|
{
|
request = WebRequest.Create(url) as HttpWebRequest;
|
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((s, c, ch, ss) => { return true; });
|
request.ProtocolVersion = HttpVersion.Version11;
|
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
|
request.KeepAlive = true;
|
ServicePointManager.CheckCertificateRevocationList = true; ServicePointManager.DefaultConnectionLimit = 100;
|
ServicePointManager.Expect100Continue = false;
|
}
|
else
|
{
|
request = WebRequest.Create(url) as HttpWebRequest;
|
}
|
|
|
request.Method = "POST";
|
request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
|
request.UserAgent = this.UserAgent;
|
request.Accept = this.Accept;
|
request.Referer = this.Referer;
|
request.ContentLength = memoryStream.Length;
|
request.CookieContainer = this.CookieContainer;
|
|
memoryStream.Position = 0;
|
byte[] tempBuffer = new byte[memoryStream.Length];
|
memoryStream.Read(tempBuffer, 0, tempBuffer.Length);
|
memoryStream.Close();
|
|
using (var streamWriter = request.GetRequestStream())
|
{
|
streamWriter.Write(tempBuffer, 0, tempBuffer.Length);
|
}
|
|
string resContent = "";
|
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
|
using (Stream resStream = response.GetResponseStream())
|
{
|
using (StreamReader streamReader = new StreamReader(resStream, Encoding.UTF8))
|
{
|
resContent = streamReader.ReadToEnd().ToString();
|
}
|
}
|
return resContent;
|
}
|
|
public static string Send(UploadParameterType parameters)
|
{
|
|
BiosenBatchFilesRequestClient client = new BiosenBatchFilesRequestClient();
|
client.parameters = parameters;
|
LogConstant.logger.Print(string.Format("[Post][File]准备上传文件[{0}]到数据服务器", parameters.FileName));
|
string t_response = client.Post(BiosenFileRequestClient.Uri);
|
JObject res = JObject.Parse(t_response);
|
if (res["status"].ToString().Equals("0"))
|
{
|
string url = res["data"].ToString();
|
LogConstant.logger.Print(string.Format("[Post][File]文件上传到数据服务器的保存地址:[{0}]", t_response));
|
return url;
|
}
|
else
|
{
|
LogConstant.logger.Print(string.Format("[Post][File]文件上传数据服务器失败:{0}", res["message"].ToString()));
|
throw new Exception(res["message"].ToString());
|
}
|
}
|
}
|
}
|