接口调用失败 错误 '800a2710' 500 <?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV=" http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi=" http://www.w3.org/20
==========================================================================================================上面的错误是使用socket发送以下包出现的:
buf.Append("Accept-Language: zh-cn\r\n");
buf.Append("Content-Type: application/x-www-form-urlencoded\r\n");
// buf.Append("Accept-Encoding: gzip, deflate\r\n");
buf.Append("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\r\n");
buf.Append("Host: home.woool.sdo.com\r\n");
buf.Append("Content-Length: " + (postbody.Length) + "\r\n");
buf.Append("Connection: Keep-Alive\r\n");
buf.Append("Cache-Control: no-cache\r\n");
buf.Append("Cookie:ASPSESSIONIDSERBU=GAANAONACLLMLCPNCDCIGFPE\r\n");
buf.Append("\r\n");
buf.Append(postbody);
byte[] ms = System.Text.UTF8Encoding.UTF8.GetBytes(buf.ToString()); socket.Send(ms);=======================================================================================================
哪位帮我解决这个问题的,赠送100元的手机话费,我会站短PM你卡密的.决不食言!
==========================================================================================================上面的错误是使用socket发送以下包出现的:
buf.Append("Accept-Language: zh-cn\r\n");
buf.Append("Content-Type: application/x-www-form-urlencoded\r\n");
// buf.Append("Accept-Encoding: gzip, deflate\r\n");
buf.Append("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\r\n");
buf.Append("Host: home.woool.sdo.com\r\n");
buf.Append("Content-Length: " + (postbody.Length) + "\r\n");
buf.Append("Connection: Keep-Alive\r\n");
buf.Append("Cache-Control: no-cache\r\n");
buf.Append("Cookie:ASPSESSIONIDSERBU=GAANAONACLLMLCPNCDCIGFPE\r\n");
buf.Append("\r\n");
buf.Append(postbody);
byte[] ms = System.Text.UTF8Encoding.UTF8.GetBytes(buf.ToString()); socket.Send(ms);=======================================================================================================
哪位帮我解决这个问题的,赠送100元的手机话费,我会站短PM你卡密的.决不食言!
摸拟网页呀,同点网页中的"提交"发出去的http包一样的内容包给服务器,应该是服务器有不同平台构成,现在遇到编码问题了。网页提交的都正常。我用socket发出去的包就会返回上面的错误,应该是我发的包网页发出的编码不一样?PS:我用wsock截取网页和我发出的包内容详细比较过,一模一样。包括空行回车符等
向服务器发送请求信息
一个HTTP请求由一个请求行、可选数目的请求标题、一个空白行,以及在POST情况下的一些额外的数据组成。请求行的格式是:
Method Request-URI HTTP-Vsersion CRLF
Method表示请求方法,如GET和POST
Request-URI标识了要请求的资源,
HTTP-Version表示请求的HTTP协议版本,
CRLF表示回车换行。 HTTP请求报文格式如下:
HTTP Command: //方法字段(GET方法,POST方法)
URI: //URL字段,发送请求至保存该网站的服务器。
HTTP Version: //http协议版本字段
Accept: //指示可被接受的请求回应的介质类型范围列表。
Accept-Language: //限制了请求回应中首选的语言为简体中文,否则使用默认值。
Accept-Encoding: //限制了回应中可接受的内容编码值
User-Agent: //定义用户代理,即发送请求的浏览器类型
Host: //定义了目标所在的主机
Connection: //告诉服务器使用连接类型
Date: Mon, 13 Jul 2009 11:03:27 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Content-Length: 871
Content-Type: text ml
Cache-Control: private
X-Cache: MISS from cdn.sdo.com
X-Cache-Lookup: MISS from cdn.sdo.com:80
Via: 1.1 cdn.sdo.com:80 (squid)
Connection: close <font face="宋体" size=2>
<p>接口调用失败 </font> <font face="宋体" size=2>错误 '800a2710' </font>
<p>
<font face="宋体" size=2>500
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV=" http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi=" http://www.w3.org/20
===================================================
这是服务器返回的内容,我是用下面方法提交http包的,用wscok抓取的包同网提点“提交”的包内容完全一样问题是不是在编码上呢?我用应该采用什么编码呀,郁闷呀,每天只有一分钟时候可测试
byte[] ms = System.Text.UTF8Encoding.UTF8.GetBytes(buf.ToString()); socket.Send(ms);
童鞋,貌似HTTP除了正体可以自定编码外其它的都是ANSI ASCII
你好,请问GB2312在哪里呀?我前几天用webrequest提交的也是这个错误:
ASCIIEncoding encoding = new ASCIIEncoding();byte[] data = encoding.GetBytes(postbody);webrequest提交的包用wsock抓出来同网页不一样,我才用socket的呢
从错误反馈来看,应该不是http协议的问题了,而可能是提交的参数不一至而导致的站点程序抛出了异常
所以,很有可能是楼主说的提交的参数的编码问题
更详细的原因目前分析不出来,得楼主给出更充分的信息根据以上信息提出以下几点:
1 对于http头,用ASCII,GB2312或者UTF-8都是一样的
2 buf.Append("Content-Length: " + (postbody.Length) + "\r\n"); 这里的Content-Length是指参数转换成字节数组后的长度,而不是直接的postbody.Length.
3 home.woool.sdo.com这个站点使用的是GB2312的编码,所以楼主可以尝试用GB2312的编码尝试一下
---------------
正确还有,winsock抓包时为什么只抓到自己软件发出的一个post包,而服务返回的没有抓取到,IE可以抓取两边的呀
---------------------------------
没有返回包,应该是http协议构造得不正确,服务器拒绝回应
应该不是的,因为我用winsock里里的复制的包原封不动的用NC来post也是这种情况(发帖刷留言啥的都没问题)
<code_desc>鎿嶄綔鎴愬姛</code_desc>(楼顶问题我用NC提交的封包是ANSI保存的扣费失败)
还有下面的可能需要改成utf-8而不是zh-cn,不过这个和你的报错没有关系的。
buf.Append("Accept-Language: zh-cn\r\n");
你好,谢谢你的回复,我开始也觉得是用软件提交连接的原因,但是我反复对比过软件提交和IE提交的过程没有不同的地方,都只有一次post过程,再加一个21;zh-cn是我复制的IE的包,上面的包内容同IE提交的都是一样的
对了,encoding.UTF8和utf8encoding.UTF8还有asciiencoding.UTF8等,都是utf8。我也不知道他们哪不同呵呵。好像他们后面跟者的编码都没有啥区别
改为buf.Append("Accept-Language: en-us\r\n");
试试
byte[] byteM=System.Text.Encoding.GetEncoding("gb2312").GetBytes(Msg1);
Response.Write(byteM.Length.ToString());
Response.Write(System.Text.Encoding.GetEncoding("gb2312").GetString(byteM));
测试了一下
结果:11
欢迎你422dd
改为
buf.Append("Content-Length: " + postbody.Length + "\r\n");
buf.Append(postbody);
改为
buf.Append("postbody");
buf.Append("postbody"); 这样里面的字符串就是postbody了,而postbody是我自定义的一个变量
zh-cn应该是没问题 postbody里面有中文的urlencode。还有软件的包和IE的包内容上是完全一样的,所以应该没问题的。
等会我试下 转成utf8和用gb2312编码测试一下。谢谢
改为
byte[] ms = System.Text.Encoding.GetEncoding("gb2312").GetBytes(buf.ToString());
buf.Append("Accept-Language: zh-cn\r\n");
改为
buf.Append("Accept-Language: zh-cn"+Strings.chr(10)); 其它类同
这个应该没问题的呀,因为一直以来各种应用socket都是这么写的,抓包出来也和IE一样的。太谢谢你热心回复了呵呵
改为
buf.Append("+postbody.Tostring()+");
Socket.BeginSend(byteData);
使用异步看看,应该是格式问题
肯定不是这个原因了,因为如果没有涉及扣费的话,服务器都能认出postbody里的内容的,而一旦需要扣费,才返回“调用接口失败”
看看是什么
应该是的,但就是奇怪网页提交的正常,软件提交的同样的内容,用wicsock抓出来完全一模一样的包
要搞成Socket调用那么复杂.......
socket.sent 对方有没有接收的相应处理程序
也就是最后一句改为:byte[] ms = System.Text.Encoding.ASCII.GetBytes(buf.ToString());
试试看。另外给你一个建议:用HttpAnalyzer(这是专门分析Http协议的)这个软件对比一下IE操作和你用程序发送的请求的http头和数据格式上有什么不同。找出不同之处问题就容易解决了。最后符一个我之前用过的一个函数给你楼主参考,希望对你有帮助
/// <summary>
/// 通过HttpHeader,cookie,PostData(byte[])返回网页文本字节流并获取HTTP头
/// </summary>
/// <param name="server"></param>
/// <param name="URL"></param>
/// <param name="byteRequest"></param>
/// <param name="cookie"></param>
/// <param name="header"></param>
/// <returns></returns>
public static byte[] GetHtmlByBytes(HttpHeader httpHeader, byte[] byteRequest, ref string cookie, out string header)
{
HttpWebRequest httpWebRequest;
HttpWebResponse webResponse;
Stream getStream; httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(httpHeader.SubmitWebPag);
CookieContainer co = new CookieContainer();
co.SetCookies(new Uri(httpHeader.Host), cookie);
httpWebRequest.CookieContainer = co; httpWebRequest.ContentType = httpHeader.ContenType;
httpWebRequest.Accept = httpHeader.Accept;
httpWebRequest.Referer = httpHeader.Referer;
httpWebRequest.UserAgent = httpHeader.UserAgent;
httpWebRequest.Method = httpHeader.Method;
httpWebRequest.ContentLength = byteRequest.Length;
Stream stream;
stream = httpWebRequest.GetRequestStream();
stream.Write(byteRequest, 0, byteRequest.Length);
stream.Close();
webResponse = (HttpWebResponse)httpWebRequest.GetResponse();
header = webResponse.Headers.ToString();
cookie = webResponse.Headers.Get("Set-Cookie");
getStream = webResponse.GetResponseStream();
byte[] outBytes = ReadFully(getStream);
getStream.Close();
return outBytes;
}
不错才怪,你更不了解TCP/IP,HTML这2种协议,否则你也不会这么写了
这个测试是可以的SocketServer 端应用程序static void Main(string[] args)
{ IPAddress address = IPAddress.Parse("127.0.0.1");
IPEndPoint point = new IPEndPoint(address, 3000);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(point);
server.Listen(3);
Socket client;
byte[] buffer = new byte[1024];
int i = 0;
string data;
Console.WriteLine("等待连接...");
if ((client = server.Accept()) != null)//进程等待
{
Console.WriteLine("用户已连接...");
while (true)
{
if ((i = client.Receive(buffer)) != 0)//进程等待
{
data = System.Text.Encoding.UTF8.GetString(buffer, 0, i);
Console.WriteLine("收到的信息为{0}", data);
Console.Write("请输入回复信息:");
string input = Console.ReadLine();
client.Send(System.Text.Encoding.UTF8.GetBytes(input));
}
}
} Console.ReadLine();
}//*************************8888socketClient客户端程序 static void Main(string[] args)
{
IPAddress address = IPAddress.Parse("127.0.0.1");
IPEndPoint point = new IPEndPoint(address, 3000);
Socket Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Client.Connect(point);//进程等待
Console.WriteLine("已连接到服务器...");
byte[] buffer = new byte[1024];
string data = null;
while (true)
{
Console.Write("请输入要发送的信息:");
string input;
input = Console.ReadLine();
if (input == "exit")
break;
Client.Send(System.Text.Encoding.UTF8.GetBytes(input));
int i = 0;
i = Client.Receive(buffer);//进程等待
if (i > 0)
{
Console.Write("服务器回复信息:");
data = System.Text.Encoding.UTF8.GetString(buffer, 0, i);
Console.WriteLine(data);
}
}
Console.WriteLine("断开连接...");
Client.Shutdown(SocketShutdown.Both);
Client.Close();
}
这个估计是用来维持session的sessionid吧
你每次都加这个cooike 如果这个session在服务器已经超时
而你访问的数据又是根据session来获得权限的
那不报错才出鬼
同行呀真的变态呀,我被折磨疯了真的陷进呀,开始写好以为很简单,什么都正常了,可一遇上扣费环节就over了但是别人的软件都可以,我写的不能用,说明还是我的软件代码问题另外,太谢谢楼上这么多热心的朋友了感激涕零!
你好.这个不会的,我拿的是新鲜有效的来测试的,如果sessionID失效,post就会返回已失效的相关信息
httpwebrequest和response结合使用我前几天第一个程序就是这么做出来的,但也是接口调用失败,我用winsock抓包发现是包头和postdata数据是分成两个不同的包,于是我才用socket。。发出去的效果用winsock抓包查看同IE提交的完全一样。
你好。谢谢你的回复:服务收到并且回复了,没有扣费的都正常,遇上扣费的就返回接口调用失败...
我刚用了你推荐的httpanalyzer。确实不错。我用winsock没抓上的返回包,在这个的COntent里面。我用这个刚也仔细比较了同IE页面post的区别,数据内容和包头都完全一样。(sessionID也是用新鲜有效的)