C#調用和實現WebService,純手工打造!

來源:互聯網
上載者:User

先為啥要純手工打造呢,因為對方是用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();

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.