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();

(0)

相关推荐

  • C#使用HttpPost请求调用WebService的方法

    之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最近发现还可以使用 Http 请求调用 WebService.这里还想说一句,还是 web api 的调用简单. WebService 服务端代码: public class WebServiceDemo : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"

  • c#动态改变webservice的url访问地址

    1.添加一个App.config配置文件. 2.配置服务http://Lenovo-PC:80/EvisaWS/WharfService?wsdl,那么在上面的文件中就会自动生成服务的配置: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8" ?><configuration>    <system.serviceModel>        <bindings>       

  • C# .Net动态调用webService实现思路及代码

    复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Net; using System.IO; using System.Web.Services.Description; using System.CodeDom; using Microsoft.CSharp; using System.CodeDom.Compiler; usi

  • C#调用WebService实例开发

    一.基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册.简单的理解就是:webservice 就是放在服务器上的函数,所有人都可以调用,然后返回信息. 比如google就有一个web service ,你调用它就可以很容易的做一个搜索网站. 就像调用函数一样,传入若

  • asp.net(c#)动态修改webservice的地址和端口(动态修改配置文件)

    这个问题其实并没有我想像的那个复杂,我们都知道怎么直接修改吧,那就是修改WebConfig文件的配置节具体的方法看下面图片 这个相信很多人都知道,直接修改就行了动态修改方式----------------------------------------------------------那么怎么动态修改呢?我想可能很多人都会这样讲,修改WebConfig文件,有专用的帮助类,也可以自己写因为WebConfig是可以Xml的形来编辑的,对的这种方法确实是可行的那么我告诉你们,你们错了,有更简单而且

  • C#动态webservice调用接口

    C#动态webservice调用接口 using System; using System.Collections; using System.IO; using System.Net; using System.Text; using System.Xml; using System.Xml.Serialization; namespace Hishop.Plugins { /// <summary> /// 利用WebRequest/WebResponse进行WebService调用的类

  • c#动态调用Webservice的两种方法实例

    方法一: 复制代码 代码如下: Hashtable ht = new Hashtable();            ht.Add("a", "testhelloworld");            XmlDocument xx = WebServicesHelper.QuerySoapWebService("http://www.jb51.net/elab_mgmt/WorkflowSchemeTaskSerivce.asmx", "

  • C# WebService发布以及IIS发布

    首先我们要做的就是先把IIS(Internet信息服务)打开,我用的是win8 的系统,所以这里以win8系统的操作来讲 一.IIS的一些事先操作 1.打开控制面板,然后进入程序 2.进入程序以后我们找到 启用或关闭Windows功能 3.进入以后把  Internet信息服务  的都选上,单击"确定" 上述的步骤好了以后我们退回到控制面板  ,找到   系统和安全 里面的  管理工具     点击"管理工具"    ,第一个就是我们的IIS了,双击打开它 我们会弹

  • c#编写webservice服务引用实例分享

    首先在新建了一个web服务文件. 复制代码 代码如下: public  SqlWhhWebService1()        {            InitializeComponent();        }        #region Component Designer generated code //Required by the Web Services Designer         private IContainer components = null; /// <su

  • C#发送HttpPost请求来调用WebService的方法

    复制代码 代码如下: void UpdateContactSign()        {           string ServerPage ="http://localhost/WebService/MyService.asmx";            try            {                //ServerPage += "?op=TangramAction";                ServerPage += "

随机推荐