最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2013年02月19日 15:13:19   作者:  
C#調(diào)用和實(shí)現(xiàn)WebService,純手工打造! 需要的朋友可以參考一下

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

悲催的弱勢(shì)方……只能我們?nèi)ヅ浜纤麄?。不提了?/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();

相關(guān)文章

  • Unity實(shí)現(xiàn)相機(jī)截圖功能

    Unity實(shí)現(xiàn)相機(jī)截圖功能

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)相機(jī)截圖功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • c# 以二進(jìn)制讀取文本文件

    c# 以二進(jìn)制讀取文本文件

    在當(dāng)前目錄創(chuàng)建一個(gè)文件myfile.txt,對(duì)該文件具有讀寫權(quán)限
    2009-07-07
  • c#中禁用windows的任務(wù)管理器的方法

    c#中禁用windows的任務(wù)管理器的方法

    這篇文章主要介紹了c#中禁用windows的任務(wù)管理器的方法,通過注冊(cè)表實(shí)現(xiàn)禁用,需要的朋友可以參考下
    2014-06-06
  • C#實(shí)現(xiàn)字符串倒序遍歷的方法小結(jié)

    C#實(shí)現(xiàn)字符串倒序遍歷的方法小結(jié)

    這篇文章主要為大家詳細(xì)介紹了C#中實(shí)現(xiàn)字符串倒序遍歷的常見方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下
    2024-02-02
  • C#實(shí)現(xiàn)讀取txt文件生成Word文檔

    C#實(shí)現(xiàn)讀取txt文件生成Word文檔

    大家好,本篇文章主要講的是C#實(shí)現(xiàn)讀取txt文件生成Word文檔,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • WPF實(shí)現(xiàn)Table布局控件的示例代碼

    WPF實(shí)現(xiàn)Table布局控件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用WPF實(shí)現(xiàn)Table布局控件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • C#多線程傳遞參數(shù)及任務(wù)用法示例

    C#多線程傳遞參數(shù)及任務(wù)用法示例

    這篇文章主要介紹了C#多線程傳遞參數(shù)及任務(wù)用法,結(jié)合簡(jiǎn)單實(shí)例形式分析了C#多線程的使用及相關(guān)的參數(shù)傳遞與任務(wù)創(chuàng)建等使用技巧,需要的朋友可以參考下
    2016-06-06
  • C#中overrid和new修飾符有什么不同

    C#中overrid和new修飾符有什么不同

    在C#的繼承中嘗嘗會(huì)用到相關(guān)的修飾詞:override和new。這兩個(gè)修飾符都可以在新的子類中,重寫同名的父類方法。下面通過本文給大家介紹C#中overrid和new修飾符的區(qū)別,感興趣的朋友一起看看吧
    2018-02-02
  • C#子類對(duì)基類方法的繼承、重寫與隱藏詳解

    C#子類對(duì)基類方法的繼承、重寫與隱藏詳解

    這篇文章主要介紹了C#子類對(duì)基類方法的繼承、重寫與隱藏的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C#動(dòng)態(tài)創(chuàng)建Access數(shù)據(jù)庫及表的方法

    C#動(dòng)態(tài)創(chuàng)建Access數(shù)據(jù)庫及表的方法

    這篇文章主要介紹了C#動(dòng)態(tài)創(chuàng)建Access數(shù)據(jù)庫及表的方法,以實(shí)例形式分析了創(chuàng)建access數(shù)據(jù)庫及在access數(shù)據(jù)庫中建表的完整過程,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12

最新評(píng)論

吉木萨尔县| 兴化市| 鹤山市| 焦作市| 垣曲县| 广灵县| 崇文区| 安庆市| 雷波县| 康马县| 寿光市| 巴青县| 专栏| 阜新市| 柏乡县| 双城市| 平邑县| 灵宝市| 城口县| 安福县| 卓资县| 邯郸县| 河源市| 石门县| 竹北市| 保亭| 张掖市| 若尔盖县| 奉节县| 正镶白旗| 年辖:市辖区| 通河县| 信阳市| 福清市| 绥棱县| 醴陵市| 靖远县| 三门县| 嘉祥县| 沈丘县| 娄底市|