栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

C#调用和实现WebService,纯手工打造!

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#调用和实现WebService,纯手工打造!

先为啥要纯手工打造呢,因为对方是用C++做的,我按照他们给出的WSDL实现了一个WebService,结果他们完全不能调用。具体是他们调用的问题还是WSDL定义的问题,不可考了。

悲催的弱势方……只能我们去配合他们。不提了。

 

首先用C#调用对方的WebService。
因为对方用的C++实现,添加Web服务引用方式无效……直接添加WSDL的调用对方不认……

只好手工打造,还好C#足够强大。

HttpWebRequest类可以简单的实现WebService调用。

 

首先手工打造SOAP包内容

复制代码 代码如下:
string soap =
    ""
    + ""
    + ""
    + ""
        + "Test Message"
    + "
"
    + "
"
    + "
";



构造HttpWebRequest对象

复制代码 代码如下:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost:8088/");
request.Method = "POST";
request.ContentType = "text/xml; charset=utf-8";
request.Headers.Add("SOAPAction", "/TestFunc");
byte[] bts = Encoding.UTF8.GetBytes(soap);


发送请求

复制代码 代码如下:
request.ContentLength = data.Length;
Stream writer = request.GetRequestStream();
writer.Write(data, 0, data.Length);
writer.Close();


获取返回信息

复制代码 代码如下:
StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.UTF8);
String retXml = sr.ReadToEnd();
sr.Close();

之后按照WSDL的定义,解析返回的XML串就好了。

当然手工打造就是累……

如果是标准的WebService,直接一句string str = Serv.TestFunc(“”);

不提了。

C#实现WebService给对方调用
按照我的理解,WebService底层是SOAP,本质上就是一个TCP的短连接。

解决的思路就是用C#来实现一个TCP的服务端,然后手工分析请求内容。

复制代码 代码如下:
//开始监听端口
myListener = new TcpListener(IPAddress.Parse(ListenIpAddr), ListenPort);
myListener.Start();


接收连接,并且获取请求内容
复制代码 代码如下:
//接受新连接
Socket mySocket = myListener.AcceptSocket();
string sBuffer = "";
Byte[] bReceive = new Byte[2048];

// 接收请求内容
int i = mySocket.Receive(bReceive, bReceive.Length, 0);
sBuffer = Encoding.ASCII.GetString(bReceive);

// 只处理 "POST"请求类型
if (sBuffer.Substring(0, 4) != "POST")
{
    return;
}

截取soap:Body部分
复制代码 代码如下:
string soap = "n";
int iStartPos = sBuffer.IndexOf("", 1);
int iStopPos = sBuffer.IndexOf("
", 1);

if (iStartPos > 0)
{
    soap = soap + sBuffer.Substring(iStartPos, iStopPos - iStartPos + 9);
}



分析请求内容这里就略了。

返回消息的构造如下。

首先构造消息体内容

复制代码 代码如下:
string ret = string.Format(
            ""
            + "n"
            + "n"
            + "n"
            + "n"
            + "n"
            + "n"
            + "n"
            + ""
            );
byte[] bytes = Encoding.ASCII.GetBytes(ret);



构造消息头部

复制代码 代码如下:
// 构造头部
String sMimeType = "text/html";
string sHttpVersion = "HTTP/1.1 ";
String sBuffer = "";

if (sMIMEHeader.Length == 0)
{
    sMIMEHeader = "text/html"; // 默认 text/html
}

sBuffer = sBuffer + sHttpVersion + " 200 OK" + "rn";
sBuffer = sBuffer + "Server: cx1193719-brn";
sBuffer = sBuffer + "Content-Type: " + sMimeType + "rn";
sBuffer = sBuffer + "Accept-Ranges: bytesrn";
sBuffer = sBuffer + "Content-Length: " + iTotBytes + "rnrn";

Byte[] heads = Encoding.ASCII.GetBytes(sBuffer);


然后发送给对方,关闭Socket。

复制代码 代码如下:
mySocket.Send(heads, heads.Length, 0);
mySocket.Send(bytes, bytes.Length, 0);

mySocket.Close();

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号