欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

悲催的弱勢方……只能我們?nèi)ヅ浜纤麄?。不提了?/P>

 

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

只好手工打造,還好C#足夠強大。

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

 

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

復制代碼 代碼如下:

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對象

復制代碼 代碼如下:

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ā)送請求

復制代碼 代碼如下:

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#實現(xiàn)WebService給對方調(diào)用
按照我的理解,WebService底層是SOAP,本質(zhì)上就是一個TCP的短連接。

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

復制代碼 代碼如下:

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


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

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

// 接收請求內(nèi)容
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);
}



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

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

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

復制代碼 代碼如下:

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)造消息頭部

復制代碼 代碼如下:

// 構(gòu)造頭部
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);


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

復制代碼 代碼如下:

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

mySocket.Close();

相關(guān)文章

  • 基于C#實現(xiàn)一個最簡單的HTTP服務(wù)器實例

    基于C#實現(xiàn)一個最簡單的HTTP服務(wù)器實例

    這篇文章主要介紹了基于C#實現(xiàn)一個最簡單的HTTP服務(wù)器的方法,詳細分析了http服務(wù)器的實現(xiàn)原理與相關(guān)技巧,以及對應(yīng)的注意事項,需要的朋友可以參考下
    2014-12-12
  • C#如何使用SHBrowseForFolder導出中文文件夾詳解

    C#如何使用SHBrowseForFolder導出中文文件夾詳解

    這篇文章主要給大家介紹了關(guān)于C#如何使用SHBrowseForFolder導出中文文件夾的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習合作工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • c# 調(diào)用Win32Api關(guān)閉當前應(yīng)用的方法

    c# 調(diào)用Win32Api關(guān)閉當前應(yīng)用的方法

    這篇文章主要介紹了c# 調(diào)用Win32Api關(guān)閉當前應(yīng)用的方法,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#判斷字符是否為漢字的三種方法分享

    C#判斷字符是否為漢字的三種方法分享

    判斷一個字符是不是漢字通常有三種方法,第一種用 ASCII 碼判斷,第二種用漢字的 UNICODE 編碼范圍判 斷,第三種用正則表達式判斷,以下是具體方法
    2014-01-01
  • c#中值類型和引用類型的基礎(chǔ)教程

    c#中值類型和引用類型的基礎(chǔ)教程

    這篇文章主要給大家介紹了關(guān)于c#中值類型和引用類型的基礎(chǔ)教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-06-06
  • C#使用Lazy<T>實現(xiàn)對客戶訂單的延遲加載

    C#使用Lazy<T>實現(xiàn)對客戶訂單的延遲加載

    這篇文章介紹了C#使用Lazy<T>實現(xiàn)對客戶訂單延遲加載的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • C# 圖片與二進制轉(zhuǎn)換的簡單實例

    C# 圖片與二進制轉(zhuǎn)換的簡單實例

    這篇文章介紹了C# 圖片與二進制轉(zhuǎn)換的簡單實例,有需要的朋友可以參考一下
    2013-09-09
  • C#調(diào)用Nero SDK刻錄光盤的方法

    C#調(diào)用Nero SDK刻錄光盤的方法

    這篇文章主要介紹了C#調(diào)用Nero SDK刻錄光盤的方法,涉及C#調(diào)用NeroCOM組件實現(xiàn)光盤刻錄的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C#多線程系列之原子操作

    C#多線程系列之原子操作

    本文詳細講解了C#多線程的原子操作,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • C# 如何使用 Index 和 Range 簡化集合操作

    C# 如何使用 Index 和 Range 簡化集合操作

    這篇文章主要介紹了C# 如何使用 Index 和 Range 簡化集合操作,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-02-02

最新評論