国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#調(diào)用和實(shí)現(xiàn)WebService,純手工打造!

2020-01-24 03:36:04
字體:
供稿:網(wǎng)友

先為啥要純手工打造呢,因?yàn)閷?duì)方是用C++做的,我按照他們給出的WSDL實(shí)現(xiàn)了一個(gè)WebService,結(jié)果他們完全不能調(diào)用。具體是他們調(diào)用的問題還是WSDL定義的問題,不可考了。

悲催的弱勢(shì)方……只能我們?nèi)ヅ浜纤麄儭2惶崃恕?/P>

 

首先用C#調(diào)用對(duì)方的WebService。
因?yàn)閷?duì)方用的C++實(shí)現(xiàn),添加Web服務(wù)引用方式無效……直接添加WSDL的調(diào)用對(duì)方不認(rèn)……

只好手工打造,還好C#足夠強(qiáng)大。

HttpWebRequest類可以簡(jiǎn)單的實(shí)現(xiàn)WebService調(diào)用。

 

首先手工打造SOAP包內(nèi)容

復(fù)制代碼 代碼如下:

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>";



構(gòu)造HttpWebRequest對(duì)象

復(fù)制代碼 代碼如下:

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


發(fā)送請(qǐng)求

復(fù)制代碼 代碼如下:

request.ContentLength = data.Length;
Stream writer = request.GetRequestStream();
writer.Write(data, 0, data.Length);
writer.Close();


獲取返回信息

復(fù)制代碼 代碼如下:

StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.UTF8);
String retXml = sr.ReadToEnd();
sr.Close();

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

當(dāng)然手工打造就是累……

如果是標(biāo)準(zhǔn)的WebService,直接一句string str = Serv.TestFunc(“”);

不提了。

C#實(shí)現(xiàn)WebService給對(duì)方調(diào)用
按照我的理解,WebService底層是SOAP,本質(zhì)上就是一個(gè)TCP的短連接。

解決的思路就是用C#來實(shí)現(xiàn)一個(gè)TCP的服務(wù)端,然后手工分析請(qǐng)求內(nèi)容。

復(fù)制代碼 代碼如下:

//開始監(jiān)聽端口
myListener = new TcpListener(IPAddress.Parse(ListenIpAddr), ListenPort);
myListener.Start();


接收連接,并且獲取請(qǐng)求內(nèi)容
復(fù)制代碼 代碼如下:

//接受新連接
Socket mySocket = myListener.AcceptSocket();
string sBuffer = "";
Byte[] bReceive = new Byte[2048];

// 接收請(qǐng)求內(nèi)容
int i = mySocket.Receive(bReceive, bReceive.Length, 0);
sBuffer = Encoding.ASCII.GetString(bReceive);

// 只處理 "POST"請(qǐng)求類型
if (sBuffer.Substring(0, 4) != "POST")
{
    return;
}


截取soap:Body部分
復(fù)制代碼 代碼如下:

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



分析請(qǐng)求內(nèi)容這里就略了。

返回消息的構(gòu)造如下。

首先構(gòu)造消息體內(nèi)容

復(fù)制代碼 代碼如下:

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



構(gòu)造消息頭部

復(fù)制代碼 代碼如下:

// 構(gòu)造頭部
String sMimeType = "text/html";
string sHttpVersion = "HTTP/1.1 ";
String sBuffer = "";

if (sMIMEHeader.Length == 0)
{
    sMIMEHeader = "text/html"; // 默認(rèn) 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);


然后發(fā)送給對(duì)方,關(guān)閉Socket。

復(fù)制代碼 代碼如下:

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

mySocket.Close();

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 福清市| 西林县| 望奎县| 稻城县| 鄂托克前旗| 女性| 金溪县| 盘锦市| 南江县| 沁源县| 崇州市| 收藏| 曲沃县| 莱西市| 贺州市| 抚顺市| 新宁县| 冀州市| 文化| 诏安县| 湘潭市| 宁都县| 原平市| 麻城市| 定州市| 长沙市| 曲周县| 舒城县| 闽清县| 临海市| 治县。| 东山县| 德化县| 忻州市| 康乐县| 新野县| 昭平县| 筠连县| 拉萨市| 和政县| 楚雄市|