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

先为啥要纯手工打造呢,因为对方是用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();

时间: 2024-11-03 22:08:30

C#调用和实现WebService,纯手工打造!_C#教程的相关文章

一年纯手工打造的Java老A上册开始预售了

Java老A这本书写了很久昨天终于开始在china-pub.京东.天猫上开始预售了不过既然叫预售就肯定还没到货. 有兴趣的人可以去看看哈后续其它网站地址也会在这里公开 china-pub http://search.china-pub.com/s/?key1=java%cc%d8%d6%d6%b1%f8&type=&pz=1 京东 http://search.jd.com/Search?keyword=Java%E7%89%B9%E7%A7%8D%E5%85%B5&enc=utf-

纯手工打造 将iPad瞬间变成老式电视机

将iPad改装成为老实的电视机其实一点都不复杂,只需要购买这个木质的纯手工制作的电视机模型即可.不过售价可不便宜,据说需要85美元的高价,而画面上的按钮也无法转台或是调音量,当然也不会附赠遥控器.装上后很像一台老式电视机(图片来自网络)播放画面的效果(图片来自网络)仅需打开上盖 把iPad装入即可(图片来自网络)未上色之前(图片来自网络)右侧的两个调节按钮仅仅是摆设(图片来自网络)iPad老式电视机配件背面(图片来自网络)小朋友们最喜欢看的卡通片播放起来效果非常不错,俨然成为了一台迷你电视机,不

超逼真《星球大战》COS - 绝对神级 cosplay 而且所有装备纯手工打造!太霸气了!

class="post_content" itemprop="articleBody"> 来自爱尔兰的 Jules 是一个 COS 迷,他这次的作品是<星球大战:旧共和国>的 Darth Malgus.这套 COS 装备完全由他亲手打造.你们在视频中看到的其他人物仅仅帮他把装备穿上而已-- Darth Malgus Costume Test

JQuery+CSS提示框实现思路及代码(纯手工打造)_jquery

复制代码 代码如下: <html> <head> <meta charset="utf-8" /> <script type="text/javascript" src="jquery-1.8.2.js"></script> <title>背景透明</title> <style> *{ margin:0; padding:0; } body{ posi

c#调用存储过程实现登录界面详解_C#教程

1,创建存储过程 复制代码 代码如下: create proc Pro_Login(@UserName nvarchar(10),@PassWord nvarchar(10))as select * from [User] UserName=@UserName and PassWord=@PassWord 2,通过类是实现配置数据库字符串连接 复制代码 代码如下: class ConnectionString{public static string conStr = "Data Source=

C#使用DllImport调用非托管的代码的方法_C#教程

找到GetShortPathName的方法签名, DWORD GetShortPathName(LPCTSTR tpszLongPath,TPTSTR lpszShortPath,DWORD cchBuffer): 非托管及托管数据类型对应关系: LPCTSTR         String LPTSTR           StringBuilder DWORD          int DllImport的导入规则: 1.方法名与Win API完全一样.如果在C#中调用时显示完全不同的方法名

通过C#调用cmd来修改服务启动类型_C#教程

可以使用System.ServiceProcess.ServiceController这个类允许连接到正在运行或者已停止的服务.对其进行操作或获取有关它的信息.ServiceController 提供了开始和停止服务的方法(Start, Stop). 但是这个类并没有提供修改服务启动类型的方法,可以通过C#调用cmd来修改 参考网上的这个方法: //设置服务的启动类型 //sServiceName服务名称 //iStartType要设置的启动类型 2:自动,3:手动,4:禁用 //返回成功状态

总结C#动态调用WCF接口的两种方法_C#教程

如何使用 1.第一种方式比较简单,而且也是大家喜欢的,因为不需要任何配置文件就可解决,只需知道服务契约接口和服务地址就可以调用. 2.使用Invoke的方式,但是需要在调用客户端配置WCF,配置后在Invoke类里封装服务契约接口即可. 客户端调用DEMO //第一种方式 string url = "http://localhost:3000/DoubleService.svc"; IDoubleService proxy = WcfInvokeFactory.CreateServic

站长一天纪实:分享纯手工外链的点点滴滴

做为个人站长,做站确实不少,包括一些行业站.企业站.游戏展以及淘宝客.有在公司工作过,也自己创业过,还有帮朋友工作过.无论在哪里,都离不开搜索引擎优化,更确切地说,离不开写文章发外链,它贯穿了我最近几年的点点滴滴.但以前发外链有时候以软文为主,有时候以购买链接为主,环境不同就采取不同的主流方法.最近又开始了自己的建站之路,所以又回归到了到处发链接的日子.话说还真不容易,本文就彻底地分享来自最前线做链接的各种痛楚与快乐! 很多大神们都有各种高招去做优化,比如链接诱饵,比如高质量软文.作为草根,哪些