C#调用和实现WebService,纯手工打造!
发布时间:2023-12-12 14:58:30
先为啥要纯手工打造呢,因为对方是用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();


猜你喜欢
- Spring之动态注册bean什么场景下,需要主动向Spring容器注册bean呢?如我之前做个的一个支持扫表的基础平台,使用者只需要添加基
- 效果图如下所示: 1、在Adapter中加入如下代码<pre style="background-color:#2
- 前言 随着Java生态愈发庞大,各种各样的新技术层出不穷,这也给大家的学习带来了很多困惑,这么多技术我该学什么,盲目的在各种新技术间
- 本文实例讲述了Android编程自定义对话框(Dialog)位置及大小的方法。分享给大家供大家参考,具体如下:代码:package ange
- 前言微信群里的一个提问引发的这个问题,C#异步有多少种实现方式?首先想要知道C#异步有多少中实现方式,首先我们要知道.NET提供的执行异步操
- 最近学习Spring的源码,发现一个利器BeanPostProcessor。这个后置处理器可以在bean初始化前后对bean进行操作。我们可
- Android Studio从3.0版本新增了许多功能,当然首当其冲就是从3.0版本新增了对 Kotlin 开发语言的支持,除此之外还有其他
- Android MediaPlayer实现音乐播放器1、布局文件<?xml version="1.0" encod
- 1. 概述官方JavaDocsApi: java.awt.FlowLayoutFlowLayout,流式布局管理器。按水平方向依次排列放置组
- 概述在以下示例中,将介绍在PDF文档页面设置页面切换按钮的方法。示例中将页面切换按钮的添加分为了两种情况,一种是设置按钮跳转到首页、下页、上
- 计算两点之间的距离然后在控制台输出,这个题目还是挺简单的。下面我们来看看具体代码。package com.swift;import java
- 本示例采用基姆拉尔森计算公式来根据日期计算未来日子是星期几:首先看下百度百科的基姆拉尔森计算公式定义:基姆拉尔森计算公式W= (d+2*m+
- Navigator 的 push 和 pop方法Navigator 导航器的 push 和 pop 方法可以携带参数在页面间传递,其他变形的
- 打包发布jar包部署相对较为简单,尤其是在分布式服务比较多的情况下。单体项目如果是单体项目,只需要找到maven的插件,点击package运
- 平时项目中只要涉及表,那么一定能接触到众多各式各样的ID编号,博主整理一些常用的ID格式,整合一个ID生成工具类,供大家参考,如果有什么不足
- 背景在很多场景下面我们需要在集合发生变化的时候能够通过一个事件对外进行通知,默认的List<T>并没有此类功能,所以对于这一类需
- ErrorPageFilter的实际应用Spring框架错误页过滤器springboot提供了一个ErrorPageFilter,用来处理当
- 前言:在Java项目中,有两个主要的构建系统:Gradle和Maven。构建系统主要管理潜在的复杂依赖关系并正确编译项目。还可以将已编译的项
- 下拉刷新在越来越多的App中使用,已经形成一种默认的用户习惯,遇到列表显示的内容时,用户已经开始习惯性的拉拉。在交互习惯上已经形成定性。之前
- Service是Android中一个类,它是Android 四大组件之一,使用Servic