C# post 模拟提交multipart/form-data的问题
注册用户的时候,post的数据是这样的
—————————–309723120027804
Content-Disposition: form-data; name=”regsubmit”
yes
—————————–309723120027804
Content-Disposition: form-data; name=”formhash”
8d099a46
—————————–309723120027804
Content-Disposition: form-data; name=”referer”
http://club.*******.com/./————————-这是网站
—————————–309723120027804
Content-Disposition: form-data; name=”activationauth”
Content-Disposition: form-data; name=”agreebbrule”
454b7635
—————————–309723120027804
Content-Disposition: form-data; name=”x7uH0V”
注册用户名
—————————–309723120027804
Content-Disposition: form-data; name=”RpRk10″
密码
—————————–309723120027804
Content-Disposition: form-data; name=”djzWdq”
密码
—————————–309723120027804
Content-Disposition: form-data; name=”Xc8eDO”
sssss@126.com
—————————–309723120027804
Content-Disposition: form-data; name=”regsubmit”
提交
—————————–309723120027804–
我用如下方法提交数据,不知道为啥总是返回“抱歉,密码空或包含非法字符”。
没找出错误的地方。还是提交multipart/form-data不能这样写呢?
public string[] PostMethodMulti(string Postdata, string Urllogin, string Urlreffer, string boundary, string proxy)//temp[0]返回网页temp[1]返回cookies
{
try
{
request = (HttpWebRequest)WebRequest.Create(Urllogin);//实例化web访问类
if (proxy != “”)
{
request.Proxy = new WebProxy(proxy, true);
request.Timeout = 2000;
}
request.Method = “POST”;//数据提交方式为POST
request.ContentType = “multipart/form-data; boundary=” + boundary;
byte[] postdatabytes = Encoding.UTF8.GetBytes(Postdata);
request.Accept = “text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8”;
request.ContentLength = postdatabytes.Length;
request.CookieContainer = cc;
request.AllowAutoRedirect = false;
request.KeepAlive = true;
request.UserAgent = “Mozilla/5.0 (Linux; U; Android 4.4.4; Nexus 5 Build/KTU84P) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30”;
System.Net.Cache.HttpRequestCachePolicy policy = new System.Net.Cache.HttpRequestCachePolicy(System.Net.Cache.HttpRequestCacheLevel.NoCacheNoStore);
request.CachePolicy = policy;
request.Headers.Add(“Accept-Encoding:gzip, deflate”);
request.Headers.Add(“Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3”);
Stream stream;
stream = request.GetRequestStream();
stream.Write(postdatabytes, 0, postdatabytes.Length);
stream.Close();
//接收响应
response = (HttpWebResponse)request.GetResponse();
//保存返回cookie
response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
CookieCollection cook = response.Cookies;
string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);
// Cookiesstr = strcrook;
//取第一次GET跳转地址
// string strcrook = response.GetResponseHeader(“Set-Cookie”);
Stream responseStream = response.GetResponseStream();
//如果http头中接受gzip的话,这里就要判断是否为有压缩,有的话,直接解压缩即可
if (response.Headers[“Content-Encoding”] != null && response.Headers[“Content-Encoding”].ToLower().Contains(“gzip”))
{
responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
}
StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
temp[0] = streamReader.ReadToEnd();
streamReader.Close();
responseStream.Close();
temp[1] = strcrook;
response.Close();
return temp;
}
catch (Exception e1)
{
temp[0] = e1.ToString();
return temp;
}
}
——解决思路———————-
注册用户名,有没有进行编码?
——解决思路———————-
先提交到你自己的 aspx或者ashx 服务,看看能不能得到所有的参数?
——解决思路———————-
涉及到通信的东西,好歹你自己得同时会做服务端和客户端,然后自己能够跟自己做的程序通信测试
直接去跟别人的程序通信,哪里出了问题没法查
——解决思路———————-
引用:注册用户的时候,post的数据是这样的
—————————–309723120027804
Content-Disposition: form-data; name=”regsubmit”
yes
—————————–309723120027804
Content-Disposition: form-data; name=”formhash”
8d099a46
—————————–309723120027804
Content-Disposition: form-data; name=”referer”
http://club.*******.com/./————————-这是网站
—————————–309723120027804
Content-Disposition: form-data; name=”activationauth”
Content-Disposition: form-data; name=”agreebbrule”
454b7635
—————————–309723120027804
Content-Disposition: form-data; name=”x7uH0V”
注册用户名
—————————–309723120027804
Content-Disposition: form-data; name=”RpRk10″
密码
—————————–309723120027804
Content-Disposition: form-data; name=”djzWdq”
密码
—————————–309723120027804
Content-Disposition: form-data; name=”Xc8eDO”
sssss@126.com
—————————–309723120027804
Content-Disposition: form-data; name=”regsubmit”
提交
—————————–309723120027804–
我用如下方法提交数据,不知道为啥总是返回“抱歉,密码空或包含非法字符”。
没找出错误的地方。还是提交multipart/form-data不能这样写呢?
public string[] PostMethodMulti(string Postdata, string Urllogin, string Urlreffer, string boundary, string proxy)//temp[0]返回网页temp[1]返回cookies
{
try
{
request = (HttpWebRequest)WebRequest.Create(Urllogin);//实例化web访问类
if (proxy != “”)
{
request.Proxy = new WebProxy(proxy, true);
request.Timeout = 2000;
}
request.Method = “POST”;//数据提交方式为POST
request.ContentType = “multipart/form-data; boundary=” + boundary;
byte[] postdatabytes = Encoding.UTF8.GetBytes(Postdata);
request.Accept = “text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8”;
request.ContentLength = postdatabytes.Length;
request.CookieContainer = cc;
request.AllowAutoRedirect = false;
request.KeepAlive = true;
request.UserAgent = “Mozilla/5.0 (Linux; U; Android 4.4.4; Nexus 5 Build/KTU84P) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30”;
System.Net.Cache.HttpRequestCachePolicy policy = new System.Net.Cache.HttpRequestCachePolicy(System.Net.Cache.HttpRequestCacheLevel.NoCacheNoStore);
request.CachePolicy = policy;
request.Headers.Add(“Accept-Encoding:gzip, deflate”);
request.Headers.Add(“Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3”);
Stream stream;
stream = request.GetRequestStream();
stream.Write(postdatabytes, 0, postdatabytes.Length);
stream.Close();
//接收响应
response = (HttpWebResponse)request.GetResponse();
//保存返回cookie
response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
CookieCollection cook = response.Cookies;
string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);
// Cookiesstr = strcrook;
//取第一次GET跳转地址
// string strcrook = response.GetResponseHeader(“Set-Cookie”);
Stream responseStream = response.GetResponseStream();
//如果http头中接受gzip的话,这里就要判断是否为有压缩,有的话,直接解压缩即可
if (response.Headers[“Content-Encoding”] != null && response.Headers[“Content-Encoding”].ToLower().Contains(“gzip”))
{
responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
}
StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
temp[0] = streamReader.ReadToEnd();
streamReader.Close();
responseStream.Close();
temp[1] = strcrook;
response.Close();
return temp;
}
catch (Exception e1)
{
temp[0] = e1.ToString();
return temp;
}
}
这个工具能帮助你实现。
http://www.sufeinet.com/thread-11995-1-1.html
——解决思路———————-
using (var client = new HttpClient())
{
using (var content = new MultipartFormDataContent())
{
var txtContent = new ByteArrayContent(Encoding.UTF8.GetBytes(“123”));
txtContent.Headers.ContentDisposition = new ContentDispositionHeaderValue(“attachment”)
{
Name = “ID”
};
content.Add(txtContent);
txtContent = new ByteArrayContent(Encoding.UTF8.GetBytes(“ABCDEFGH12345678”));
txtContent.Headers.ContentDisposition = new ContentDispositionHeaderValue(“attachment”)
{
Name = “Name”
};
content.Add(txtContent);
var result = client.PostAsync(“/api/values/1”, content).Result;
this.textBox1.Text = result.Content.ReadAsStringAsync().Result;
Console.WriteLine(result.StatusCode);
}
}
HttpClient的方式提交,因为你用的FormData方式提交,那么每个都必须一个个写