HttpWebRequest 請求方
測試Form窗體
private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Multiselect = false;
fileDialog.Title = "请选择文件";
fileDialog.Filter = "所有文件(*.*)|*.*";
if (fileDialog.ShowDialog() == DialogResult.OK)
{
richTextBox1.Text += fileDialog.FileName + "\r\n";
}
}
private void button1_Click(object sender, EventArgs e)
{
try
{
string Url = "http://localhost:60877/Handlers/HTTPHandler.ashx";
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("httptype", "E2");
dictionary.Add("userid", "D025575");
dictionary.Add("mailnos", "CCC00");
List<HTTPHelper.HTTPFiles> AttachFile = new List<HTTPHelper.HTTPFiles>();
if (richTextBox1.Text != "")
{
int id = 0;
foreach (string Attach in richTextBox1.Lines)
{
id++;
if (Attach != "")
{
HTTPHelper.HTTPFiles At = new HTTPHelper.HTTPFiles();
At.FilePath = Attach;
At.FileGuid = id.ToString();
AttachFile.Add(At);
}
}
}
string Result = HTTPHelper.HTTPHelper.HttpPostMutiData(Url, dictionary, AttachFile, 300000);
MessageBox.Show(Result);
}
catch (Exception ex)
{
throw ex;
}
}
HTTPHelper 類
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true;
}
/// <summary>
/// 將文件轉化為請求數據流
/// </summary>
/// <param name="httpWebRequest"></param>
/// <param name="HFiles"></param>
private static void PostHFileStream(Stream postStream, List<HTTPFiles> HFiles, byte[] itemBoundaryBytes)
{
try
{
int HCount = HFiles.Count;
if (HCount > 0)
{
for (int i = 0; i < HCount; i++)
{
if (File.Exists(HFiles[i].FilePath))
{
string fileName = "";
if (HFiles[i].FileGuid != "")
{
fileName = HFiles[i].FileGuid + HFiles[i].FileExt;//爲了防止文件名重複
}
else
{
fileName = HFiles[i].FileName;
}
//请求头部信息
StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", HFiles[i].FileGuid + HFiles[i].FileExt));
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());
FileStream fs = new FileStream(HFiles[i].FilePath, FileMode.Open, FileAccess.Read);
byte[] bArr = new byte[fs.Length];
fs.Read(bArr, 0, bArr.Length);
fs.Close();
postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
postStream.Write(bArr, 0, bArr.Length);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 將打包參數轉化為數據流
/// </summary>
/// <param name="httpWebRequest"></param>
/// <param name="parameters"></param>
private static void PostParamsStream(Stream postStream, IDictionary<string, string> parameters, byte[] itemBoundaryBytes)
{
try
{
if (parameters.Count > 0)
{
Encoding encoding = Encoding.GetEncoding("utf-8");
string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
foreach (string current in parameters.Keys)
{
string formitem = string.Format(formdataTemplate, current, parameters[current]);
byte[] bytes = encoding.GetBytes(formitem.ToString());
postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
postStream.Write(bytes, 0, bytes.Length);
}
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 獲取請求返回值
/// </summary>
/// <param name="response"></param>
/// <param name="encoding"></param>
/// <returns></returns>
private static string GetResponseString(HttpWebResponse response, Encoding encoding)
{
string result;
using (Stream responseStream = response.GetResponseStream())
{
string @string;
using (MemoryStream memoryStream = new MemoryStream())
{
if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
{
new GZipStream(responseStream, CompressionMode.Decompress).CopyTo(memoryStream, 2048);
}
else
{
responseStream.CopyTo(memoryStream, 2048);
}
byte[] array = memoryStream.ToArray();
@string = encoding.GetString(array);
string value = Regex.Match(@string, "<meta.*?charset=\"?([a-z0-9-]+)\\b", RegexOptions.IgnoreCase).Groups[1].Value;
if (value != "" && value.ToLower().IndexOf("utf") == -1)
{
try
{
@string = Encoding.GetEncoding(value).GetString(array, 0, array.Length);
}
catch
{
}
}
}
result = @string;
}
return result;
}
/// <summary>
/// 綜合請求Post資料
/// </summary>
/// <param name="url"></param>
/// <param name="parameters">字符串參數</param>
/// <param name="HFiles">文件清單</param>
/// <param name="timeout">超時限制</param>
/// <returns></returns>
public static string HttpPostMutiData(string url, IDictionary<string, string> parameters, List<HTTPFiles> HFiles, int timeout)
{
string result;
try
{
HttpWebRequest httpWebRequest = null;
Encoding encoding = Encoding.GetEncoding("utf-8");
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(HTTPHelper.CheckValidationResult);
httpWebRequest = (WebRequest.Create(url) as HttpWebRequest);
}
else
{
httpWebRequest = (WebRequest.Create(url) as HttpWebRequest);
}
httpWebRequest.KeepAlive = true;
httpWebRequest.Method = "POST";
httpWebRequest.AllowAutoRedirect = true;//開啟允許自動重新定向
CookieContainer cookieContainer = new CookieContainer();
httpWebRequest.CookieContainer = cookieContainer;
string boundary = DateTime.Now.Ticks.ToString("X"); // 微秒轉換為16進制的數字 作為分割線 每個參數前用分割線區分,參數結束分割線結束
httpWebRequest.ContentType = "multipart/form-data;charset=utf-8;;boundary=" + boundary;
byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
httpWebRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");//允許接受壓縮數據
Stream requestStream = httpWebRequest.GetRequestStream();
if (HFiles!=null&&HFiles.Count > 0)
{
PostHFileStream(requestStream, HFiles, itemBoundaryBytes);//文件傳送,打包文件流
if (parameters == null)
{
parameters = new Dictionary<string, string>();
}
parameters.Add("HFiles", JsonConvert.SerializeObject(HFiles));//文件對應的屬性,轉化為Json字符串,作為字符串參數傳遞
}
if (parameters != null && parameters.Count > 0)
{
PostParamsStream(requestStream, parameters,itemBoundaryBytes);//字符串參數
}
requestStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);//結束分割線
requestStream.Close();//關閉流
result = HTTPHelper.GetResponseString(httpWebRequest.GetResponse() as HttpWebResponse, encoding);
return result;
}
catch (Exception ex)
{
throw ex;
}
}
接收方 一般處理文件
public class HTTPHandler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
HTTPControl.BaseHandler action = null;
string acStr = context.Request["httptype"];
if (acStr == null)
{
context.Response.Write("0");
return;
}
switch (acStr)
{
case "E2":
action = new HTTPControl.FHTTPTest(context);
break;
}
if (action == null)
{
context.Response.Write("0");
}
else
{
action.Process();
}
}
public bool IsReusable {
get {
return false;
}
}