#region POST from-data 表单post请求
public classFormItemModel
{///
///表单键,request["key"]///
public string Key { set; get; }///
///表单值,上传文件时忽略,request["key"].value///
public string Value { set; get; }///
///是否是文件///
public boolIsFile
{get{if (FileContent == null || FileContent.Length == 0)return false;if (FileContent != null && FileContent.Length > 0 && string.IsNullOrWhiteSpace(FileName))throw new Exception("上传文件时 FileName 属性值不能为空");return true;
}
}///
///上传的文件名///
public string FileName { set; get; }///
///上传的文件内容///
public Stream FileContent { set; get; }
}///
///使用Post方法获取字符串结果///
///
/// Post表单内容
///
/// 默认20秒
/// 响应内容的编码类型(默认utf-8)
///
public static string PostForm(string url, List formItems, CookieContainer cookieContainer = null, string refererUrl = null, Encoding encoding = null, int timeOut = 20000)
{
HttpWebRequest request=(HttpWebRequest)WebRequest.Create(url);#region 初始化请求对象request.Method= "POST";
request.Timeout=timeOut;
request.Accept= "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
request.KeepAlive= true;
request.UserAgent= "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36";if (!string.IsNullOrEmpty(refererUrl))
request.Referer=refererUrl;if (cookieContainer != null)
request.CookieContainer=cookieContainer;#endregion
string boundary = "----" + DateTime.Now.Ticks.ToString("x");//分隔符
request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);//请求流
var postStream = newMemoryStream();#region 处理Form表单请求内容
//是否用Form上传文件
var formUploadFile = formItems != null && formItems.Count > 0;if(formUploadFile)
{//文件数据模板
string fileFormdataTemplate =
"\r\n--" + boundary +
"\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"" +
"\r\nContent-Type: application/octet-stream" +
"\r\n\r\n";//文本数据模板
string dataFormdataTemplate =
"\r\n--" + boundary +
"\r\nContent-Disposition: form-data; name=\"{0}\"" +
"\r\n\r\n{1}";foreach (var item informItems)
{string formdata = null;if(item.IsFile)
{//上传文件
formdata = string.Format(
fileFormdataTemplate,
item.Key,//表单键
item.FileName);
}else{//上传文本
formdata = string.Format(
dataFormdataTemplate,
item.Key,
item.Value);
}//统一处理
byte[] formdataBytes = null;//第一行不需要换行
if (postStream.Length == 0)
formdataBytes= Encoding.UTF8.GetBytes(formdata.Substring(2, formdata.Length - 2));elseformdataBytes=Encoding.UTF8.GetBytes(formdata);
postStream.Write(formdataBytes,0, formdataBytes.Length);//写入文件内容
if (item.FileContent != null && item.FileContent.Length > 0)
{using (var stream =item.FileContent)
{byte[] buffer = new byte[1024];int bytesRead = 0;while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
{
postStream.Write(buffer,0, bytesRead);
}
}
}
}//结尾
var footer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
postStream.Write(footer,0, footer.Length);
}else{
request.ContentType= "application/x-www-form-urlencoded";
}#endregionrequest.ContentLength=postStream.Length;#region 输入二进制流
if (postStream != null)
{
postStream.Position= 0;//直接写入流
Stream requestStream =request.GetRequestStream();byte[] buffer = new byte[1024];int bytesRead = 0;while ((bytesRead = postStream.Read(buffer, 0, buffer.Length)) != 0)
{
requestStream.Write(buffer,0, bytesRead);
}debug
//postStream.Seek(0, SeekOrigin.Begin);//StreamReader sr = new StreamReader(postStream);//var postStr = sr.ReadToEnd();
postStream.Close();//关闭文件访问
}#endregionHttpWebResponse response=(HttpWebResponse)request.GetResponse();if (cookieContainer != null)
{
response.Cookies=cookieContainer.GetCookies(response.ResponseUri);
}using (Stream responseStream =response.GetResponseStream())
{using (StreamReader myStreamReader = new StreamReader(responseStream, encoding ??Encoding.UTF8))
{string retString =myStreamReader.ReadToEnd();returnretString;
}
}
}#endregion