问题描述
httpwebrequest模拟请求模拟请求表单的post请求表单时multipart/form-data模式的模拟请求出错错误信息如下SpecifiedvaluehasinvalidControlcharacters.Parametername:valueatSystem.Net.WebHeaderCollection.CheckBadChars(Stringname,BooleanisHeaderValue)atSystem.Net.HttpWebRequest.SetSpecialHeaders(StringHeaderName,Stringvalue)atSystem.Net.HttpWebRequest.set_Referer(Stringvalue)atSdStateGridAcquirer.HTMLHelper.HttpPostS(Stringurl,Stringpostdata,Stringreferer,Stringboundary)
解决方案
解决方案二:
你要了解RFC2188协议以及后续的扩展协议,你提交的body数据格式要符合人家的规范。
解决方案三:
引用1楼sp1234的回复:
你要了解RFC2188协议以及后续的扩展协议,你提交的body数据格式要符合人家的规范。
这是我httpwatch抓到的东西POST/web/scc/sflow/distributetask/distributeTask.do?action=saveAndSendHTTP/1.1Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/msword,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/xaml+xml,application/x-ms-xbap,application/x-ms-application,*/*Referer:http://10.158.249.36/web/scc/sflow/distributetask/distributeTask.do?action=init&activity=sgcsc002&processType=109&processNo=10903&appNo=141127765087&taskID=315649188&orgNo=3740403&actName=%E5%9C%B0%E5%B8%82%E6%8E%A5%E5%8D%95%E6%B4%BE%E5%B7%A5Accept-Language:zh-cnContent-Type:multipart/form-data;boundary=---------------------------7de1863814700f2UA-CPU:x86Accept-Encoding:gzip,deflateUser-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;.NETCLR2.0.50727;.NET4.0C;.NET4.0E)Host:10.158.249.36Content-Length:2383Connection:Keep-AliveCache-Control:no-cacheCookie:logonUsername=88882;ZP_CAL=%27fdow%27%3Anull%2C%27history%27%3A%222014/11/26/23/59%2C2014/11/26/23/59%2C2014/12/26/23/59%2C2014/12/27/23/59%2C2014/11/26/00/00%2C2014/11/27/00/00%2C2014/11/27/00/00%2C2014/11/26/00/00%2C2014/11/26/00/00%22%2C%27sortOrder%27%3A%22asc%22%2C%27hsize%27%3A9;JSESSIONID=vyvLJ2yL3nTvpGsXY10n7rXnbq6TFvwGsNMrfQkvX9bTJFhL7DZw!2142538846-----------------------------7de1863814700f2Content-Disposition:form-data;name="siteTypeCode"02-----------------------------7de1863814700f2Content-Disposition:form-data;name="appointReason"-----------------------------7de1863814700f2Content-Disposition:form-data;name="bookingTime"-----------------------------7de1863814700f2Content-Disposition:form-data;name="acceptTime"2014-11-2709:17-----------------------------7de1863814700f2Content-Disposition:form-data;name="appNo"141127765087-----------------------------7de1863814700f2Content-Disposition:form-data;name="taskId"315649188-----------------------------7de1863814700f2Content-Disposition:form-data;name="vheicleId"-----------------------------7de1863814700f2Content-Disposition:form-data;name="reapairEmpNoName"瀛熷簞鎶慨缁?-----------------------------7de1863814700f2Content-Disposition:form-data;name="reapairEmpNo"瀛熷簞鎶慨缁?-----------------------------7de1863814700f2Content-Disposition:form-data;name="repairOrg"374040304-----------------------------7de1863814700f2Content-Disposition:form-data;name="repairDeptNo"0001488348-----------------------------7de1863814700f2Content-Disposition:form-data;name="dispachTime"2014-11-2709:17:47-----------------------------7de1863814700f2Content-Disposition:form-data;name="normalOpinion"5050074696-----------------------------7de1863814700f2Content-Disposition:form-data;name="handleOpinion"璇峰鐞嗭紝骞舵寜銆婃灒搴勫叕鍙?5598涓氬姟宸ュ崟濉啓鎵嬪唽銆嬭繘琛屽弽棣堣澶勭悊-----------------------------7de1863814700f2Content-Disposition:form-data;name="wkstAttach.contentFile";filename=""Content-Type:application/octet-stream-----------------------------7de1863814700f2Content-Disposition:form-data;name="forkValue"鏁呴殰澶勭悊-----------------------------7de1863814700f2Content-Disposition:form-data;name="flowHandleDept"0010924641-----------------------------7de1863814700f2Content-Disposition:form-data;name="isSmsNotice"1-----------------------------7de1863814700f2Content-Disposition:form-data;name="orgNo"3740403-----------------------------7de1863814700f2Content-Disposition:form-data;name="countyCode"370402-----------------------------7de1863814700f2--
解决方案四:
cookiepostdata数据都拿到了就是不知道提交数据编码
解决方案五:
一般用UTF-8就行了。
解决方案六:
应该是你生成的数据有问题了,可以参考一下这个链接http://blog.csdn.net/flymorn/article/details/6769722
解决方案七:
http://www.telerik.com/fiddler/add-ons有fiddler抓,然后在这里下个配套的代码生成器,直接把请求拖到code页就帮你生成代码了
解决方案八:
光有错误信息,看不出多少门道啊,不如贴上部分代码
解决方案九:
是不是多了两个--,之前我也弄这个东西,估计是那个-号的问题。多一个少一个都不行,你捉个标准的对比一下吧
解决方案十:
boundary=---------------------------7de1863814700f2这个是动态的,请求了几次这个值都不一样
解决方案十一:
publicstaticboolHttpPostS(stringurl,stringpostdata,stringreferer,stringboundary){boolst=true;try{stringresult="";CookieContainercCurrent=newCookieContainer();Uriu=newUri(url);cCurrent.Add(u,newCookie("JSESSIONID",jsessionId));cCurrent.Add(u,newCookie("logonUsername",XF_Main.UserName));//if(P3p!=null)//{//cCurrent.Add(u,newCookie("P3P",P3p));//}HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(url);varmemStream=newMemoryStream();//边界符varbeginBoundary=Encoding.ASCII.GetBytes("--"+"---------------------------"+boundary+"rn");varfileStream=newFileStream(Application.StartupPath+@"file.dat",FileMode.Open,FileAccess.Read);//最后的结束符varendBoundary=Encoding.ASCII.GetBytes("--"+"---------------------------"+boundary+"--rn");//设置属性request.Headers.Clear();request.Method="POST";//必须为大写,不然会出错//request.Headers.Add("headName",HttpUtility.UrlEncode("value"));request.ContentType="multipart/form-data;boundary=---------------------------"+boundary;//request.Accept="image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/msword,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/xaml+xml,application/x-ms-xbap,application/x-ms-application,*/*";request.UserAgent="Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;.NETCLR2.0.50727;.NET4.0C;.NET4.0E)";XF_Main.WriteErrorLog(referer);//newNameValueCollection()//request.ContentLength=data.Length;request.Referer=referer;request.AllowAutoRedirect=true;request.KeepAlive=true;request.CookieContainer=cCurrent;request.Timeout=6000;//超时时间XF_Main.WriteErrorLog("3");//写入上传文件stringfilePartHeader="Content-Disposition:form-data;name="{0}";filename="{1}"rn"+"Content-Type:text/plainrnrn";varheader=string.Format(filePartHeader,"wkstAttach.contentFile",Application.StartupPath+@"file.dat");varheaderbytes=Encoding.UTF8.GetBytes(header);memStream.Write(beginBoundary,0,beginBoundary.Length);memStream.Write(headerbytes,0,headerbytes.Length);varbuffer=newbyte[1024];intbytesRead;//=0XF_Main.WriteErrorLog("4");while((bytesRead=fileStream.Read(buffer,0,buffer.Length))!=0){memStream.Write(buffer,0,bytesRead);}memStream.Write(Encoding.UTF8.GetBytes(postdata),0,Encoding.UTF8.GetBytes(postdata).Length);//写入最后的结束边界符memStream.Write(endBoundary,0,endBoundary.Length);request.ContentLength=memStream.Length;XF_Main.WriteErrorLog("5");//UTF8Encodingencoding=newUTF8Encoding();//ASCIIEncodingencoding=newASCIIEncoding();//byte[]data=encoding.GetBytes(postdata);//post方式的编码//byte[]data=Encoding.UTF8.GetBytes(postdata);//post方式的编码//XF_Main.WriteErrorLog("21");//request.Headers.Clear();//request.ServicePoint.ConnectionLimit//request.UserAgent="Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;.NETCLR2.0.50727;.NET4.0C;.NET4.0E)";//request.Headers.Add("Accept-Language","zh-cn");//request.Headers.Add("Accept-Encoding","gzip,deflate");//request.Accept="application/x-shockwave-flash,image/gif,image/jpeg,image/pjpeg,image/pjpeg,application/xaml+xml,application/vnd.ms-xpsdocument,application/x-ms-xbap,application/x-ms-application,application/msword,application/vnd.ms-excel,application/vnd.ms-powerpoint,*/*";//request.Host="10.158.249.36";//request.PreAuthenticate=true;//request.Credentials=CredentialCache.DefaultCredentials;//XF_Main.WriteErrorLog("3");//提交请求stream=request.GetRequestStream();memStream.Position=0;vartempBuffer=newbyte[memStream.Length];memStream.Read(tempBuffer,0,tempBuffer.Length);memStream.Close();stream.Write(tempBuffer,0,tempBuffer.Length);stream.Close();//接收HttpWebResponseresponse=(HttpWebResponse)request.GetResponse();//XF_Main.WriteErrorLog("4");if(response.StatusCode!=HttpStatusCode.OK)returnfalse;//StreamReaderstreamReader=newStreamReader(response.GetResponseStream(),Encoding.GetEncoding("utf-8"));//StreamReaderstreamReader=newStreamReader(response.GetResponseStream(),Encoding.UTF8);StreamReaderstreamReader=newStreamReader(response.GetResponseStream(),Encoding.UTF8);result=streamReader.ReadToEnd();request.Abort();response.Close();streamReader.Close();cCurrent=null;returnst;}catch(Exceptionex){XF_Main.WriteErrorLog(ex.Message+"rn"+ex.StackTrace);st=false;returnfalse;}returnst;}publicstaticstringGetMultipartData(stringpostdata,stringboundary){array=postdata.Split('&');datas=newStringBuilder();foreach(stringstrinarray){string[]arr=str.Split('=');//if(str.Contains("wkstAttach"))//datas.AppendFormat("-----------------------------{0}rnContent-Disposition:form-data;name="{1}";filename=""rnContent-Type:application/octet-streamrnrn{2}rn",boundary,arr[0],arr[1]);//elsedatas.AppendFormat("-----------------------------{0}rnContent-Disposition:form-data;name="{1}"rnrn{2}rn",boundary,arr[0],arr[1]);}datas.AppendFormat("-----------------------------{0}--rn",boundary);returndatas.ToString();}
解决方案十二:
这是部分代码stringboundary=DateTime.Now.Ticks.ToString("x");
这是我生成的boundary是不是跟网站上的不一样导致的