1. 程式人生 > >C# 三種動態呼叫WebService的方法,測試通過

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時先呼叫該類的拷