C# 三種動態呼叫WebService的方法,測試通過
廢話少說,直接上碼:
Python 伺服器端:
import soaplib from soaplib.service import rpc from soaplib.service import DefinitionBase from soaplib.model.primitive import String, Integer from soaplib.server import wsgi from soaplib.model.clazz import Array ''' This is a simple HelloWorld example to show the basics of writing a webservice using soaplib, starting a server, and creating a service client. ''' class SmartDataAnalyze(DefinitionBase): @rpc(String, Integer, _returns=Array(String)) def say_hello(self, name, times): ''' Docstrings for service methods appear as documentation in the wsdl <b>what fun</b> @param name the name to say hello to @param the number of times to say hello @return the completed array ''' results = [] for i in range(0, times): results.append('Hello, %s' % name) return results @rpc(String,String,_returns=String) def GetHXD(self,VesselVoyage,CntrSize): sResult=VesselVoyage + '---/---' + CntrSize return sResult if __name__=='__main__': try: from wsgiref.simple_server import make_server soap_application = soaplib.Application([SmartDataAnalyze], 'tns') wsgi_application = wsgi.Application(soap_application) print "listening to http://223.223.83.238/?wsdl" server = make_server('223.223.83.238',80, wsgi_application) server.serve_forever() except ImportError: print "Error: example server code requires Python >= 2.5"
C# 通用類
#region 利用WebService呼叫類 /// <summary> /// 利用WebRequest/WebResponse進行WebService呼叫的類 /// </summary> public class WebSvcCaller { //<webServices> // <protocols> // <add name="HttpGet"/> // <add name="HttpPost"/> // </protocols> //</webServices> private static Hashtable _xmlNamespaces = new Hashtable();//快取xmlNamespace,避免重複呼叫GetNamespace /// <summary> /// 需要WebService支援Post呼叫 /// </summary> public static XmlDocument QueryPostWebService(String URL, String MethodName, Hashtable Pars) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; SetWebRequest(request); byte[] data = EncodePars(Pars); WriteRequestData(request, data); return ReadXmlResponse(request.GetResponse()); } /// <summary> /// 需要WebService支援Get呼叫 /// </summary> public static XmlDocument QueryGetWebService(String URL, String MethodName, Hashtable Pars) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars)); request.Method = "GET"; request.ContentType = "application/x-www-form-urlencoded"; SetWebRequest(request); return ReadXmlResponse(request.GetResponse()); } /// <summary> /// 通用WebService呼叫(Soap),引數Pars為String型別的引數名、引數值 /// </summary> public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars) { if (_xmlNamespaces.ContainsKey(URL)) { return QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString()); } else { return QuerySoapWebService(URL, MethodName, Pars, GetNamespace(URL)); } } private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars, string XmlNs) { _xmlNamespaces[URL] = XmlNs;//加入快取,提高效率 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL); request.Method = "POST"; request.ContentType = "text/xml; charset=utf-8"; request.Headers.Add("SOAPAction", "\"" + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + MethodName + "\""); SetWebRequest(request); byte[] data = EncodeParsToSoap(Pars, XmlNs, MethodName); WriteRequestData(request, data); XmlDocument doc = new XmlDocument(), doc2 = new XmlDocument(); doc = ReadXmlResponse(request.GetResponse()); XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable); mgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/"); String RetXml = doc.SelectSingleNode("//soap:Body/*/*", mgr).InnerXml; doc2.LoadXml("<root>" + RetXml + "</root>"); AddDelaration(doc2); return doc2; } private static string GetNamespace(String URL) { string sURL = URL; string sResult = ""; if (URL.IndexOf("?") < 0) { sURL = URL + "?WSDL"; } try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sURL); SetWebRequest(request); WebResponse response = request.GetResponse(); StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8); XmlDocument doc = new XmlDocument(); doc.LoadXml(sr.ReadToEnd()); sr.Close(); sResult= doc.SelectSingleNode("//@targetNamespace").Value; } catch { } return sResult; } private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName) { XmlDocument doc = new XmlDocument(); doc.LoadXml("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"></soap:Envelope>"); AddDelaration(doc); XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/"); XmlElement soapMethod = doc.CreateElement(MethodName); soapMethod.SetAttribute("xmlns", XmlNs); foreach (string k in Pars.Keys) { XmlElement soapPar = doc.CreateElement(k); soapPar.InnerXml = ObjectToSoapXml(Pars[k]); soapMethod.AppendChild(soapPar); } soapBody.AppendChild(soapMethod); doc.DocumentElement.AppendChild(soapBody); return Encoding.UTF8.GetBytes(doc.OuterXml); } private static string ObjectToSoapXml(object o) { XmlSerializer mySerializer = new XmlSerializer(o.GetType()); MemoryStream ms = new MemoryStream(); mySerializer.Serialize(ms, o); XmlDocument doc = new XmlDocument(); doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray())); if (doc.DocumentElement != null) { return doc.DocumentElement.InnerXml; } else { return o.ToString(); } } private static void SetWebRequest(HttpWebRequest request) { request.Credentials = CredentialCache.DefaultCredentials; request.Timeout = 10000; } private static void WriteRequestData(HttpWebRequest request, byte[] data) { request.ContentLength = data.Length; Stream writer = request.GetRequestStream(); writer.Write(data, 0, data.Length); writer.Close(); } private static byte[] EncodePars(Hashtable Pars) { return Encoding.UTF8.GetBytes(ParsToString(Pars)); } private static String ParsToString(Hashtable Pars) { StringBuilder sb = new StringBuilder(); foreach (string k in Pars.Keys) { if (sb.Length > 0) { sb.Append("&"); } //sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(Pars[k].ToString())); } return sb.ToString(); } private static XmlDocument ReadXmlResponse(WebResponse response) { StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8); String retXml = sr.ReadToEnd(); sr.Close(); XmlDocument doc = new XmlDocument(); doc.LoadXml(retXml); return doc; } private static void AddDelaration(XmlDocument doc) { XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null); doc.InsertBefore(decl, doc.DocumentElement); } } #endregion
呼叫Demo:
public string GetDAWebService() { Hashtable ht = new Hashtable(); ht.Add("VesselVoyage", "dfdasf"); ht.Add("CntrSize", "20"); XmlDocument xdoc = WebSvcCaller.QuerySoapWebService("http://223.223.83.238/?wsdl", "GetHXD", ht); return xdoc.OuterXml.ToString(); }
相關推薦
C# 三種動態呼叫WebService的方法,測試通過
廢話少說,直接上碼: Python 伺服器端: import soaplib from soaplib.service import rpc from soaplib.service import DefinitionBase from soaplib.model.pr
C#中Winform動態呼叫Webservice的方法
一般情況下winform呼叫webservice時步驟 1新增服務引用---高階----新增web引用------填寫url--新增web引用即可完成對webservice的引用 讓VS.NET環境來為我們生成服務代理,然後呼叫對應的Web服務。 如果需要動態呼叫WebSe
C#動態呼叫WebService方法之WS代理
通常我們在程式中需要呼叫WebService時,都是通過“新增Web引用”,讓VS.NET環境來為我們生成服務代理,然後呼叫對應的Web服務。這樣是使工作簡單了,但是卻和提供Web服務的URL、方法名、引數繫結在一起了,這是VS.NET自動為我們生成Web服務代理的限制。
asp.net 動態呼叫webservice方法
假設我們現在已經有一個做好的webservice方法: [WebMethod(Description = "獲取分包商進場計劃資訊明細(根據時間範圍)")] public string getSubcontractorPlanList(s
終於搞定無參“動態呼叫WebService方法”,其實很簡單,大家還是要有信心,還是要有琢磨的精神。
終於搞定“動態呼叫WebService方法”: 我在學習 動態呼叫WebService方法時看到很多網友在呼叫函式(其實往往是“無參”函式)時得到一個錯誤: 未將物件引用設定到物件的例項。 這個錯誤很常見,貌似不好處理,沒明白的人不知所云,所以這裡提醒我們自己:凡是
C#動態呼叫webservice的方法
轉載自http://blog.sina.com.cn/s/blog_5d25ac4e0100yiel.html 一般情況下winform呼叫webservice時步驟 1新增服務引用---高階----新增web引用------填寫url--新增web引用即可完成對w
動態呼叫WebService的兩種方法(多執行緒)
轉載:https://blog.csdn.net/huanglan513/article/details/46930393 在.net中,可以新增Web 引用來新增WebService,但是這種方法的缺陷是當WebService內的方法一變動,引用的系統這邊就必須更新引用,重新編譯,再發布,是不
C#三種創建對象方法所需時間比較。。。。。
http common AD ins eat 通過 png pos sem C#創建對象的三種方法 new()、Activator、Assembly,接下來通過代碼直接來看看運行的速度。。。。 首先,先看看三種創建對象實例的方法: //new
c# 三種計算程序運行時間的方法
thread lis start color 計算 程序 enc 三種 c++ 三種計算c#程序運行時間的方法第一種:利用 System.DateTime.Now // example1: System.DateTime.Now method DateTime dt1 =
轉載:動態呼叫WebService(C#)
#region InvokeWebService // 動態呼叫web服務 public static object InvokeWebService( string url, string methodname, object
三種動態載入js的jquery例項程式碼另附去除js方法
!-- 這裡為你提供了三種動態載入js的jquery例項程式碼哦,由於jquery是為使用者提供方便的,所以利用jquery動態載入檔案只要一句話$.getscript("test.js");就ok了。 <!doctype html public "-//w3c//d
1、利用介面實現動態的建立物件[選做題] 1.1 建立4個類: 蘋果 香蕉 葡萄 園丁 1.2 在三種水果的構造方法中列印一句話. 以蘋果類為例
package javademo9; import java.util.Scanner; interface Fruit{ } class Apple implements Fruit { public Apple() { System.out.println("建立了一個蘋
動態呼叫WebService服務的方法
public static object InvokeWebService(string url, string methodname, object[] args) { return WebServiceHelpe
Net 下采用GET/POST/SOAP方式動態呼叫WebService C#實現
一直以來,我們都為動態呼叫WebService方法而煩惱。在.Net環境下,最常用的方法就是採用代理類來呼叫WebService,可以通過改變代理類的Url屬性來實現動態呼叫,但當xmlns改變時就會出錯,似乎要重新繫結Webservice並重新編譯後才能再次執行。我
Canvas三種動態畫圓實現方法說明
前言 canvas是HTML5出來的繪圖API容器,對於圖形的處理非常強大,下面使用canvas配合JavaScript來做一下動態畫圓效果。可以用它來做圓形進度條來使用。 這裡我個人總結了3種實現方法,大家可以參考一下。 方法一:arc(
C#不新增引用,動態呼叫webservice
好像很多人做WebService的時候都是直接新增引用的方式,然後呼叫服務端的方法。這樣就個問題,就是每次我服務端添加了方法或者修改了方法後都要更新Web引用,這樣比較麻煩。下面給一個不用新增引用的方式呼叫服務端的方法
C# 之 動態呼叫WebService
通過前一篇部落格《WCF 之 AJax前臺呼叫WCF服務》我們可以不用配置終結點,而且可以動態的呼叫WCF服務。但是我們不僅僅要會動態的呼叫WCF服務,同時也需要研究一下怎麼樣動態的呼叫Web Service,今天就給大家介紹一下。 首先,我們先建立兩個Web Serv
Winform動態呼叫Webservice的方法
1新增服務引用---高階----新增web引用------填寫url--新增web引用即可完成對webservice的引用 讓VS.NET環境來為我們生成服務代理,然後呼叫對應的Web服務。 如果需要動態呼叫WebService,要實現這樣的功能: publicstaticobjectInvokeWebSe
C++ Builder下三種UDP通訊實現方法的比較 選擇自 findheart 的 Blog
C++ Builder下三種UDP通訊實現方法的比較 選擇自 findheart 的 Blog 關鍵字 C++ Builder下三種UDP通訊實現方法的比較 出處 主要討論一下資料的接受:1.NMUDP控制元件 這個控制元件使用起來比較簡單,設定
C++三種引數傳遞方法(值傳遞、指標傳遞、引用傳遞)的一些知識
C++的函式引數傳遞有三種方法:值傳遞、引用傳遞、指標傳遞 。其中引用傳遞和指標傳遞幾乎一樣,只不過引用傳遞在使用時比指標更安全。 (1)關於函式返回一個物件 當你的函式返回型別是【非引用】的型別時,return時先呼叫該類的拷