c#模拟formdata_C# 模拟表单post请求 from-data

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值