当前位置: 代码迷 >> C# >> C# post 模拟提交multipart/form-data的有关问题
  详细解决方案

C# post 模拟提交multipart/form-data的有关问题

热度:105   发布时间:2016-05-05 03:51:24.0
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"

[email protected]
-----------------------------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"

[email protected]
-----------------------------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方式提交,那么每个都必须一个个写
  相关解决方案