先为啥要纯手工打造呢,因为对方是用C++做的,我按照他们给出的WSDL实现了一个WebService,结果他们完全不能调用。具体是他们调用的问题还是WSDL定义的问题,不可考了。
悲催的弱势方……只能我们去配合他们。不提了。
首先用C#调用对方的WebService。
因为对方用的C++实现,添加Web服务引用方式无效……直接添加WSDL的调用对方不认……
只好手工打造,还好C#足够强大。
HttpWebRequest类可以简单的实现WebService调用。
首先手工打造SOAP包内容
</div>
构造HttpWebRequest对象
发送请求
</div>
获取返回信息
之后按照WSDL的定义,解析返回的XML串就好了。
当然手工打造就是累……
如果是标准的WebService,直接一句string str = Serv.TestFunc(“”);
不提了。
C#实现WebService给对方调用
按照我的理解,WebService底层是SOAP,本质上就是一个TCP的短连接。
解决的思路就是用C#来实现一个TCP的服务端,然后手工分析请求内容。
</div>
接收连接,并且获取请求内容
// 接收请求内容
int i = mySocket.Receive(bReceive, bReceive.Length, 0);
sBuffer = Encoding.ASCII.GetString(bReceive);
// 只处理 "POST"请求类型
if (sBuffer.Substring(0, 4) != "POST")
{
return;
}
</div>
截取soap:Body部分
if (iStartPos > 0)
{
soap = soap + sBuffer.Substring(iStartPos, iStopPos - iStartPos + 9);
}
</div>
分析请求内容这里就略了。
返回消息的构造如下。
首先构造消息体内容
</div>
构造消息头部
if (sMIMEHeader.Length == 0)
{
sMIMEHeader = "text/html"; // 默认 text/html
}
sBuffer = sBuffer + sHttpVersion + " 200 OK" + "\r\n";
sBuffer = sBuffer + "Server: cx1193719-b\r\n";
sBuffer = sBuffer + "Content-Type: " + sMimeType + "\r\n";
sBuffer = sBuffer + "Accept-Ranges: bytes\r\n";
sBuffer = sBuffer + "Content-Length: " + iTotBytes + "\r\n\r\n";
Byte[] heads = Encoding.ASCII.GetBytes(sBuffer);
</div>
然后发送给对方,关闭Socket。
mySocket.Close();
</div>
</div>