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

 更新时间:2013年02月19日 15:13:19   作者:  
C#调用和实现WebService,纯手工打造! 需要的朋友可以参考一下

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

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

 

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

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

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

 

首先手工打造SOAP包内容

复制代码 代码如下:

string soap =
    "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:down=\"http://down.wsdl.position.mdd.ailk.com\" xmlns:in=\"http://in.object.down.wsdl.position.mdd.ailk.com\">"
    + "<soapenv:Header/>"
    + "<soapenv:Body>"
    + "<TestFunc>"
        + "<object>Test Message</object>"
    + "</TestFunc>"
    + "</soapenv:Body>"
    + "</soapenv:Envelope>";



构造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 = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
int iStartPos = sBuffer.IndexOf("<soap:Body>", 1);
int iStopPos = sBuffer.IndexOf("</soap:Body>", 1);

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



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

返回消息的构造如下。

首先构造消息体内容

复制代码 代码如下:

string ret = string.Format(
            ""
            + "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:down=\"http://down.wsdl.position.mdd.ailk.com\" xmlns:out=\"http://out.object.down.wsdl.position.mdd.ailk.com\">\n"
            + "<soapenv:Header/>\n"
            + "<soapenv:Body>\n"
            + "<TestRsp>\n"
            + "<object ResultCode=\"0\"/>\n"
            + "</TestRsp>\n"
            + "</soapenv:Body>\n"
            + "</soapenv:Envelope>"
            );
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" + "\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);


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

复制代码 代码如下:

mySocket.Send(heads, heads.Length, 0);
mySocket.Send(bytes, bytes.Length, 0);

mySocket.Close();

相关文章

  • 基于C#实现一个最简单的HTTP服务器实例

    基于C#实现一个最简单的HTTP服务器实例

    这篇文章主要介绍了基于C#实现一个最简单的HTTP服务器的方法,详细分析了http服务器的实现原理与相关技巧,以及对应的注意事项,需要的朋友可以参考下
    2014-12-12
  • C#如何使用SHBrowseForFolder导出中文文件夹详解

    C#如何使用SHBrowseForFolder导出中文文件夹详解

    这篇文章主要给大家介绍了关于C#如何使用SHBrowseForFolder导出中文文件夹的相关资料,文中通过示例代码介绍的非常详细,对大家的学习合作工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • c# 调用Win32Api关闭当前应用的方法

    c# 调用Win32Api关闭当前应用的方法

    这篇文章主要介绍了c# 调用Win32Api关闭当前应用的方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C#判断字符是否为汉字的三种方法分享

    C#判断字符是否为汉字的三种方法分享

    判断一个字符是不是汉字通常有三种方法,第一种用 ASCII 码判断,第二种用汉字的 UNICODE 编码范围判 断,第三种用正则表达式判断,以下是具体方法
    2014-01-01
  • c#中值类型和引用类型的基础教程

    c#中值类型和引用类型的基础教程

    这篇文章主要给大家介绍了关于c#中值类型和引用类型的基础教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06
  • C#使用Lazy<T>实现对客户订单的延迟加载

    C#使用Lazy<T>实现对客户订单的延迟加载

    这篇文章介绍了C#使用Lazy<T>实现对客户订单延迟加载的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • C# 图片与二进制转换的简单实例

    C# 图片与二进制转换的简单实例

    这篇文章介绍了C# 图片与二进制转换的简单实例,有需要的朋友可以参考一下
    2013-09-09
  • C#调用Nero SDK刻录光盘的方法

    C#调用Nero SDK刻录光盘的方法

    这篇文章主要介绍了C#调用Nero SDK刻录光盘的方法,涉及C#调用NeroCOM组件实现光盘刻录的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#多线程系列之原子操作

    C#多线程系列之原子操作

    本文详细讲解了C#多线程的原子操作,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • C# 如何使用 Index 和 Range 简化集合操作

    C# 如何使用 Index 和 Range 简化集合操作

    这篇文章主要介绍了C# 如何使用 Index 和 Range 简化集合操作,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-02-02

最新评论