接口调用失败 错误 '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你卡密的.决不食言! 

解决方案 »

  1.   


    摸拟网页呀,同点网页中的"提交"发出去的http包一样的内容包给服务器,应该是服务器有不同平台构成,现在遇到编码问题了。网页提交的都正常。我用socket发出去的包就会返回上面的错误,应该是我发的包网页发出的编码不一样?PS:我用wsock截取网页和我发出的包内容详细比较过,一模一样。包括空行回车符等
      

  2.   

    缺少请求的http命令和URI地址
    向服务器发送请求信息 
      一个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:         //告诉服务器使用连接类型 
      

  3.   

    www.***.cnHTTP/1.0 500 Inernal Server Error 
    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 
    &lt;?xml version='1.0' encoding='UTF-8'?&gt; 
    &lt;SOAP-ENV:Envelope xmlns:SOAP-ENV=&quot; http://schemas.xmlsoap.org/soap/envelope/&quot; xmlns:xsi=&quot; http://www.w3.org/20 
    ===================================================
    这是服务器返回的内容,我是用下面方法提交http包的,用wscok抓取的包同网提点“提交”的包内容完全一样问题是不是在编码上呢?我用应该采用什么编码呀,郁闷呀,每天只有一分钟时候可测试
    byte[] ms = System.Text.UTF8Encoding.UTF8.GetBytes(buf.ToString());         socket.Send(ms); 
      

  4.   

    TO Simonzy:全部有的,用wcosk抓出来比较过,同网页发的完全一样我们本地完全一样,但服务器认出不一样,我想问题就出在编码上。。 System.Text.UTF8Encoding.UTF8
      

  5.   

    那你换成gb2312试试其实,你使用WebClient 或简单些吧
      

  6.   

    呃...
    童鞋,貌似HTTP除了正体可以自定编码外其它的都是ANSI ASCII
      

  7.   


    你好,请问GB2312在哪里呀?我前几天用webrequest提交的也是这个错误:
    ASCIIEncoding encoding = new ASCIIEncoding();byte[] data = encoding.GetBytes(postbody);webrequest提交的包用wsock抓出来同网页不一样,我才用socket的呢
      

  8.   

    Encoding gb2312 = System.Text.Encoding.GetEncoding("gb2312");
      

  9.   

    楼上的这样没有意义呀,试过encoding了
      

  10.   

    没看到你完整的HTTP协议的构造过程
    从错误反馈来看,应该不是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的编码尝试一下
      

  11.   

    谢谢楼上的,我发的包和网页提交的用winwsock抓出来效果完全一样,一个字符变动都没有。他应该是不同需求不同服务器处理,一般提交上去都返回正常的,但一到扣费环节就返回"调用接口失败",GB2312是否像楼上朋友所帖的用法? gb2312.getbytes()?
      

  12.   

    普通网页(没有安全认证啥的)提交没问题,同样的http包内容,我用我写的自动提交软件如果会扣费就返回“接口调用失败",请问除了编码问题外还有可能的其它原因吗? 还有,winsock抓包时为什么只抓到自己软件发出的一个post包,而服务返回的没有抓取到,IE可以抓取两边的呀
      

  13.   

    GB2312是否像楼上朋友所帖的用法? gb2312.getbytes()?
    ---------------
    正确还有,winsock抓包时为什么只抓到自己软件发出的一个post包,而服务返回的没有抓取到,IE可以抓取两边的呀
    ---------------------------------
    没有返回包,应该是http协议构造得不正确,服务器拒绝回应
      

  14.   

    不是的呀,服务器有返回了,socket.Receive也已经读出来了,但winsock里面没有返回包
      

  15.   


    应该不是的,因为我用winsock里里的复制的包原封不动的用NC来post也是这种情况(发帖刷留言啥的都没问题)
      

  16.   

    问题出在编码问题上的可能性比较大,因为我试过同一个扣费平台的其它应用,我用NC提交ANSI保存的post封包正常扣费,而用UTF8编码另存后再用NC提交回显同前者一样,但没有扣费:
    <code_desc>鎿嶄綔鎴愬姛</code_desc>(楼顶问题我用NC提交的封包是ANSI保存的扣费失败)
      

  17.   

    好像错误不在你贴的这段代码里,接口调用错误,必定是在建立链接那一步就出错了,到你贴的这段代码时,报错一般显示客户端强制中断了连接的错误。
    还有下面的可能需要改成utf-8而不是zh-cn,不过这个和你的报错没有关系的。
    buf.Append("Accept-Language: zh-cn\r\n"); 
      

  18.   


    你好,谢谢你的回复,我开始也觉得是用软件提交连接的原因,但是我反复对比过软件提交和IE提交的过程没有不同的地方,都只有一次post过程,再加一个21;zh-cn是我复制的IE的包,上面的包内容同IE提交的都是一样的
      

  19.   


    对了,encoding.UTF8和utf8encoding.UTF8还有asciiencoding.UTF8等,都是utf8。我也不知道他们哪不同呵呵。好像他们后面跟者的编码都没有啥区别
      

  20.   

    buf.Append("Accept-Language: zh-cn\r\n"); 
    改为buf.Append("Accept-Language: en-us\r\n"); 
    试试
      

  21.   

    你把你的代码文件另存为UTF-8格式看看
      

  22.   

    string   Msg1="欢迎你422dd";   
      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     
      

  23.   

    如果西文占多数,就用UTF8传。中文占多数,就用Unicode传
      

  24.   

     buf.Append("Content-Length: " + (postbody.Length) + "\r\n"); 
    改为
     buf.Append("Content-Length: " + postbody.Length + "\r\n"); 
    buf.Append(postbody); 
    改为
    buf.Append("postbody"); 
      

  25.   

    谢谢大家热心回复,
    buf.Append("postbody");  这样里面的字符串就是postbody了,而postbody是我自定义的一个变量
    zh-cn应该是没问题 postbody里面有中文的urlencode。还有软件的包和IE的包内容上是完全一样的,所以应该没问题的。
      

  26.   


    等会我试下  转成utf8和用gb2312编码测试一下。谢谢
      

  27.   

    byte[] ms = System.Text.UTF8Encoding.UTF8.GetBytes(buf.ToString()); 
    改为
    byte[] ms = System.Text.Encoding.GetEncoding("gb2312").GetBytes(buf.ToString());   
      

  28.   


    buf.Append("Accept-Language: zh-cn\r\n"); 
    改为
    buf.Append("Accept-Language: zh-cn"+Strings.chr(10)); 其它类同
      

  29.   


    这个应该没问题的呀,因为一直以来各种应用socket都是这么写的,抓包出来也和IE一样的。太谢谢你热心回复了呵呵
      

  30.   

    buf.Append(postbody); 
    改为 
    buf.Append("+postbody.Tostring()+");
      

  31.   

    byte[] byteData = Encoding.ASCII.GetBytes(data);            
    Socket.BeginSend(byteData); 
    使用异步看看,应该是格式问题
      

  32.   

    <?xml version='1.0' encoding='gb2312'?>
      

  33.   


    肯定不是这个原因了,因为如果没有涉及扣费的话,服务器都能认出postbody里的内容的,而一旦需要扣费,才返回“调用接口失败”
      

  34.   

    response.write(buf.ToString())
    看看是什么
      

  35.   


    应该是的,但就是奇怪网页提交的正常,软件提交的同样的内容,用wicsock抓出来完全一模一样的包
      

  36.   

    参数是ref out 或其它类型要注意一下
      

  37.   

    既然对方是SOAP = Webservice 为啥不用WSDL生成直接调用的Webservice的代码?
    要搞成Socket调用那么复杂.......
      

  38.   

    看看 Webservice接收的数据类型是什么格式的。
    socket.sent 对方有没有接收的相应处理程序
      

  39.   

    不要用UTF8,用System.Text.Encoding.ASCII
    也就是最后一句改为: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;
            }
      

  40.   

    byte[] ms = System.Text.UTF8Encoding.UTF8.GetBytes(buf.ToString()); -------------------------------------
    不错才怪,你更不了解TCP/IP,HTML这2种协议,否则你也不会这么写了
      

  41.   

    client.Send(System.Text.Encoding.UTF8.GetBytes(input));UTF8可以send的
      

  42.   

    用Encoding.ASCII会中文乱码 ,用Encoding.Default.GetBytes(input) 
      

  43.   


    这个测试是可以的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();
            }
      

  44.   

    buf.Append("Cookie:ASPSESSIONIDSERBU=GAANAONACLLMLCPNCDCIGFPE\r\n"); 
    这个估计是用来维持session的sessionid吧
    你每次都加这个cooike 如果这个session在服务器已经超时
    而你访问的数据又是根据session来获得权限的
    那不报错才出鬼
      

  45.   


    同行呀真的变态呀,我被折磨疯了真的陷进呀,开始写好以为很简单,什么都正常了,可一遇上扣费环节就over了但是别人的软件都可以,我写的不能用,说明还是我的软件代码问题另外,太谢谢楼上这么多热心的朋友了感激涕零!
      

  46.   


    你好.这个不会的,我拿的是新鲜有效的来测试的,如果sessionID失效,post就会返回已失效的相关信息
      

  47.   

    zzxap 朋友的回复虽然都没在问题根源上,但能回复这么多,而且都是很认真的分析,真的谢谢你。
      

  48.   

    response.write(buf.ToString()) 看看得到的结果是什么。只要一步步分析,我就不信解决不了。
      

  49.   


    httpwebrequest和response结合使用我前几天第一个程序就是这么做出来的,但也是接口调用失败,我用winsock抓包发现是包头和postdata数据是分成两个不同的包,于是我才用socket。。发出去的效果用winsock抓包查看同IE提交的完全一样。
      

  50.   


    你好。谢谢你的回复:服务收到并且回复了,没有扣费的都正常,遇上扣费的就返回接口调用失败...
    我刚用了你推荐的httpanalyzer。确实不错。我用winsock没抓上的返回包,在这个的COntent里面。我用这个刚也仔细比较了同IE页面post的区别,数据内容和包头都完全一样。(sessionID也是用新鲜有效的)
      

  51.   

    你好,我是需要写网游辅助类软件,不是网站方呀,socket很简单的呀,可以制造任意数据包,不像webrequest那样这样的很多限制