我部署了一个WebService在机子上,因为特殊的原因,我不能向通常情况那样在客户端添加一个WEB引用去访问WebService,而是必须要建立一个SOCKET去访问,也就是将发送的信息,按照HTTP协议那样封装,发到Webservice。
但是现在的问题是,我第一个包不能是HTTP协议的包,而是发送一个字符串(因为这个通讯要通过一个设备,必须发送这个字符串去验证),而只要我发了这样一个字符串之后再发送HTTP协议的包,Webservice都收不到了,如果我不发这个字符串的话,都是可以收到的,不知道有没有对HTTP协议比较熟悉的朋友,指点一下这是什么原因,有什么办法能够解决呢!!!!!非常感谢!!!

解决方案 »

  1.   

    我想应该是IIS的问题,发送字符串不符合他的规则,后面不能发送很正常
    另外就是编码问题,我现在发送中文就出现乱码,不知道怎么回事
      

  2.   

    1、首先你的这个特殊的地方,需要验证的时候,发送的那个字符串,是否发送给WebService的?还是发给一个其他的端口?如果这样,你可以先用socket连接发送验证字符串,验证通过后:2、用WebRequest发送HTTP请求,请看MSDN对于该类的介绍!
    首先假设有如下的Web Service方法定义(DemoService.asmx):
    [ScriptService]
    public class DemoService  : System.Web.Services.WebService
    {
        [WebMethod]
        public string DemoMethod()
        {
            return "Hello World";
        }   
    }
    var request = DemoService.DemoMethod(onComplete);
      

  3.   

    其实我现在的程序,就是要通过一个物理网闸,WebService在一个后置机上面(也就是内网里面),所以我的前置机(也就是外网的机子)程序就必须通过SOCKET先发送一个验证包(那个网闸只支持这种方式),不过现在我想这个不是什么大问题了,因为我发送验证包是发送给网闸,这个字符串不会到达WEBSERVICE那里。不过现在还有一个问题就是中文乱码了,我用了很多种方式,接收到的都是乱码,下面是代码string soap1 = @"<?xml version=""1.0"" encoding=""utf-8""?>
    <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" 
       xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" 
       xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
      <soap:Body>
        <Register xmlns=""http://tempuri.org/"">
          <id>123</id>
          <data1>" + "phonenumber," + "12312312321测试" + @"</data1>
        </Register>
      </soap:Body>
    </soap:Envelope>";            string httpHeader1 = @"POST /WebServiceTest/WebServiceTest.asmx HTTP/1.1
    SOAPAction: ""http://tempuri.org/Register""
    Content-Type: text/xml;charset=""utf-8""
    Accept: text/xml
    Host: 192.168.1.118:80
    Content-Length: " + soap1.Length +
    @"
    Expect: 100-continue
    Connection: Keep-Alive";try
                {
                    if (this._socket == null)
                    {
                        this._socket = new System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        _socket.Connect(new IPEndPoint(IPAddress.Parse("192.168.1.118"), 80));
                        BeginReceiving();_socket.Send(Encoding.UTF8.GetBytes(httpHeader1 + soap1));
                    }
                }
                catch (Exception ex)
                { }
      

  4.   

    估计是少了回车换行了,http协议遵循telnet协议,每一个请求后面都需要一个 "\r\n",否则认为是无效数据