1. 程式人生 > >.Net 動態呼叫WebService

.Net 動態呼叫WebService

1.CSharp實現類

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Web.Services.Description;
using System.CodeDom;
using Microsoft.CSharp;
using System.CodeDom.Compiler;

namespace WindowsApplication1
{
    /// <summary>
    ///動態呼叫WebService
    /// </summary>
    public class WsCaller
    {
        /// <summary>
        /// 獲取WebService型別
        /// </summary>
        /// <param name="wsUrl">WebService地址</param>
        /// <returns></returns>
        private static string GetWsClassName(string wsUrl)
        {
            string[] parts = wsUrl.Split('/');
            string[] pps = parts[parts.Length - 1].Split('.');

            return pps[0];
        }

        /// <summary>
        /// 呼叫WebService
        /// </summary>
        /// <param name="wsUrl">WebService地址</param>
        /// <param name="methodName">方法名稱</param>
        /// <param name="args">引數列表</param>
        /// <returns></returns>
        public static object InvokeWebService(string wsUrl, string methodName, object[] args)
        {
            return InvokeWebService(wsUrl, null, methodName, args);
        }

        /// <summary>
        /// 呼叫WebService
        /// </summary>
        /// <param name="wsUrl">WebService地址</param>
        /// <param name="className">類名</param>
        /// <param name="methodName">方法名稱</param>
        /// <param name="args">引數列表</param>
        /// <returns></returns>
        public static object InvokeWebService(string wsUrl, string className, string methodName, object[] args)
        {
            string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
            if ((className == null) || (className == ""))
            {
                className = GetWsClassName(wsUrl);
            }

            try
            {
                //獲取WSDL
                WebClient wc = new WebClient();
                Stream stream = wc.OpenRead(wsUrl + "?wsdl");
                ServiceDescription sd = ServiceDescription.Read(stream);
                ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
                sdi.AddServiceDescription(sd, "", "");
                CodeNamespace cn = new CodeNamespace(@namespace);

                //生成客戶端代理類程式碼
                CodeCompileUnit ccu = new CodeCompileUnit();
                ccu.Namespaces.Add(cn);
                sdi.Import(cn, ccu);
                CSharpCodeProvider csc = new CSharpCodeProvider();
                ICodeCompiler icc = csc.CreateCompiler();

                //設定編譯引數
                CompilerParameters cplist = new CompilerParameters();
                cplist.GenerateExecutable = false;
                cplist.GenerateInMemory = true;
                cplist.ReferencedAssemblies.Add("System.dll");
                cplist.ReferencedAssemblies.Add("System.XML.dll");
                cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
                cplist.ReferencedAssemblies.Add("System.Data.dll");

                //編譯代理類
                CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
                if (true == cr.Errors.HasErrors)
                {
                    System.Text.StringBuilder sb = new System.Text.StringBuilder();
                    foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
                    {
                        sb.Append(ce.ToString());
                        sb.Append(System.Environment.NewLine);
                    }
                    throw new Exception(sb.ToString());
                }

                //生成代理例項,並呼叫方法
                System.Reflection.Assembly assembly = cr.CompiledAssembly;
                Type t = assembly.GetType(@namespace + "." + className, true, true);
                object obj = Activator.CreateInstance(t);
                System.Reflection.MethodInfo mi = t.GetMethod(methodName);

                return mi.Invoke(obj, args);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
            }
        }
    }
}

2.呼叫測試

   A:建立Java編寫的WebService,公佈的一個方法為:HelloWorld,返回值為HelloWorld

   B:建立CSharp編寫的WebService,公佈的一個方法為:HelloWorld,返回值為HelloWorld

   呼叫方法程式碼如下:  

            try
            {
                string url = "http://127.0.0.1:8090/HelloWorld/services/Service";
                //string url = "http://localhost/WebService/Service.asmx";
                //string[] args = new string[1];
                //args[0] = "P000001";
                object result = WsCaller.InvokeWebService(url, "HelloWorld", null);                 this.textBox1.Text = result.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }          呼叫成功,返回值均可看到結果:HelloWorld!

相關推薦

asp.net 動態呼叫webservice方法

假設我們現在已經有一個做好的webservice方法: [WebMethod(Description = "獲取分包商進場計劃資訊明細(根據時間範圍)")] public string getSubcontractorPlanList(s

.Net 動態呼叫WebService

1.CSharp實現類 using System;using System.Collections.Generic;using System.Text;using System.Net;using System.IO;using System.Web.Services.Des

Net 下采用GET/POST/SOAP方式動態呼叫WebService C#實現

 一直以來,我們都為動態呼叫WebService方法而煩惱。在.Net環境下,最常用的方法就是採用代理類來呼叫WebService,可以通過改變代理類的Url屬性來實現動態呼叫,但當xmlns改變時就會出錯,似乎要重新繫結Webservice並重新編譯後才能再次執行。我

cxf動態呼叫webservice慢的解決方案

CXF初次呼叫webservce很慢,是因為建立的過程比較耗時 初步方案可以結合快取(redis等)加快呼叫過程 //定義快取,加快建立效率 public static Map<String,Endpoint> factoryMap=new HashMap<Strin

轉載:動態呼叫WebService(C#)

         #region InvokeWebService // 動態呼叫web服務 public static object InvokeWebService( string url, string methodname, object

.net core 呼叫 webservice

1,新增服務引用生成 客戶端程式碼           2,開始編碼         public static String GetInfoListData

.NET/C#呼叫webservice的坑

服務引用和Web服務引用是有區別的: 如果他的Service為 WCF Service  那得新增服務引用 , 如果是普通的WebServices  就新增 Web服務引用。  如果你的webservice呼叫是寫在dll裡面的, 那麼應該把dllnam

動態呼叫WebService服務的方法

         public static object InvokeWebService(string url, string methodname, object[] args)         {             return WebServiceHelpe

動態呼叫webservice地址(類)

public static class WebServiceHelper { /// <summary> /// 動態呼叫WebService /// </summary>

C#不新增引用,動態呼叫webservice

好像很多人做WebService的時候都是直接新增引用的方式,然後呼叫服務端的方法。這樣就個問題,就是每次我服務端添加了方法或者修改了方法後都要更新Web引用,這樣比較麻煩。下面給一個不用新增引用的方式呼叫服務端的方法

C#動態呼叫webservice的方法

轉載自http://blog.sina.com.cn/s/blog_5d25ac4e0100yiel.html 一般情況下winform呼叫webservice時步驟 1新增服務引用---高階----新增web引用------填寫url--新增web引用即可完成對w

C# 之 動態呼叫WebService

通過前一篇部落格《WCF 之 AJax前臺呼叫WCF服務》我們可以不用配置終結點,而且可以動態的呼叫WCF服務。但是我們不僅僅要會動態的呼叫WCF服務,同時也需要研究一下怎麼樣動態的呼叫Web Service,今天就給大家介紹一下。 首先,我們先建立兩個Web Serv

Java動態呼叫Webservice,不生成客戶端,基於soapUI

近日專案一需求,需要實現動態解析Webservice滿足Webservice動態呼叫。參考過CXF、AXIS等非常成熟的相關框架技術,但在使用過程中發現,簡單物件(入參、出參)的時候很好用,當是複雜物件的時候很棘手!當然CXF、AXIS全然滿足,也支援物件,動態引數等,但構造

Winform動態呼叫Webservice的方法

1新增服務引用---高階----新增web引用------填寫url--新增web引用即可完成對webservice的引用 讓VS.NET環境來為我們生成服務代理,然後呼叫對應的Web服務。 如果需要動態呼叫WebService,要實現這樣的功能: publicstaticobjectInvokeWebSe

開發:隨筆記錄之 CXF 動態呼叫Webservice

import javax.xml.rpc.ServiceException; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; import org.apache.log4j.Lo

java客戶端動態呼叫webservice服務

      之前呼叫webservice服務一直用jdk或者eclipse快速生成客戶端程式碼,這種方式實現起來也比較容易,據說這種方法執行效率也是最好的(動態呼叫也會動態生成客戶端程式碼)。但是我最近在專案發現這種方式存在一個嚴重的弊端,那就是當服務端有修改或變動,客戶端

動態呼叫WebService的兩種方法(多執行緒)

轉載:https://blog.csdn.net/huanglan513/article/details/46930393 在.net中,可以新增Web 引用來新增WebService,但是這種方法的缺陷是當WebService內的方法一變動,引用的系統這邊就必須更新引用,重新編譯,再發布,是不

C# 三種動態呼叫WebService的方法,測試通過

廢話少說,直接上碼: Python 伺服器端: import soaplib from soaplib.service import rpc from soaplib.service import DefinitionBase from soaplib.model.pr

終於搞定無參“動態呼叫WebService方法”,其實很簡單,大家還是要有信心,還是要有琢磨的精神。

終於搞定“動態呼叫WebService方法”: 我在學習 動態呼叫WebService方法時看到很多網友在呼叫函式(其實往往是“無參”函式)時得到一個錯誤: 未將物件引用設定到物件的例項。 這個錯誤很常見,貌似不好處理,沒明白的人不知所云,所以這裡提醒我們自己:凡是

C#中Winform動態呼叫Webservice的方法

一般情況下winform呼叫webservice時步驟 1新增服務引用---高階----新增web引用------填寫url--新增web引用即可完成對webservice的引用 讓VS.NET環境來為我們生成服務代理,然後呼叫對應的Web服務。 如果需要動態呼叫WebSe