動態調用WebService 通用方法Moss 中 傳統開發中均可用。

WebService是啥你們都知道了,這裏不作過多的解釋。一般咱們使用WebService的作法基本都是在咱們的項目中添加Web引用的方式,首先找到WebService的地址,而後定義命名空間,這樣會在咱們的項目中生成一個WebService的動態鏈接庫,就能夠直接使用WebService中提供的各類方法了。web

今天分享的是動態建立WebService。這裏所謂的動態建立WebService究竟是什麼意思呢?就是不須要再項目中添加Web引用就能夠使用你想調用的WebService中的方法了。跨域

不過使用起來稍微有點複雜。後面我會給出調用的小實例。性能方面沒作測試。但願你們能多提寶貴意見。服務器

先貼代碼: 一個動態建立動態鏈接庫的方法。ide

#region 動態生成WebService程序集   CreateWSAssembly

        /// <summary>
        /// 動態生成WebService程序集
        /// </summary>
        /// <param name="DiyWsNameSpace">定義的WebService的命名空間</param>
        /// <param name="WebServiceSortUrl">除網站根目錄後的WebServiceUrl</param>
        /// <param name="myNetWorkCredential">跨服務器時所使用的用戶身份,如在編譯環境下 設置爲null便可</param>
        /// <returns>WebService程序集</returns>

        private System.Reflection.Assembly CreateWSAssembly(String DiyWsNameSpace, string WebServiceUrl, System.Net.NetworkCredential myNetWorkCredential)
        {
            #region 跟據WebServiec 生成客戶端可用的代碼
            System.Net.WebClient webClient = new System.Net.WebClient();

            if (myNetWorkCredential != null)
                webClient.Credentials = myNetWorkCredential;
            else
                webClient.Credentials = System.Net.CredentialCache.DefaultCredentials;

            System.IO.Stream stream = webClient.OpenRead(WebServiceUrl + "?WSDL");
            //用於建立或格式化WebService的服務描述語言的文檔文件類
            System.Web.Services.Description.ServiceDescription serviceDescription = System.Web.Services.Description.ServiceDescription.Read(stream);
            //用戶生成WebService 客戶端代理類
            System.Web.Services.Description.ServiceDescriptionImporter serviceDescriptionImporter = new System.Web.Services.Description.ServiceDescriptionImporter();
            serviceDescriptionImporter.AddServiceDescription(serviceDescription, "", "");
            System.CodeDom.CodeNamespace coDeNamespace = new System.CodeDom.CodeNamespace(DiyWsNameSpace);
            System.CodeDom.CodeCompileUnit codeCompileUnit = new System.CodeDom.CodeCompileUnit();
            codeCompileUnit.Namespaces.Add(coDeNamespace);
            serviceDescriptionImporter.Import(coDeNamespace, codeCompileUnit);
            #endregion

            //對代碼生成器和代碼編譯器的實例的訪問的提供程序
            Microsoft.CSharp.CSharpCodeProvider CSharpProvider = new Microsoft.CSharp.CSharpCodeProvider();
            //獲取C#代碼編譯器的實例
            System.CodeDom.Compiler.ICodeCompiler iCompiler = CSharpProvider.CreateCompiler();
            //調用實例所要用的參數
            System.CodeDom.Compiler.CompilerParameters cParams = new System.CodeDom.Compiler.CompilerParameters();
            //是否生成可執行文件
            cParams.GenerateExecutable = false;
            //是否在內存中生成輸出
            cParams.GenerateInMemory = true;
            //要使用的程序集
            cParams.ReferencedAssemblies.Add("System.dll");
            cParams.ReferencedAssemblies.Add("System.XML.dll");
            cParams.ReferencedAssemblies.Add("System.Web.Services.dll");
            cParams.ReferencedAssemblies.Add("System.Data.dll");

            //從編譯器返回的編譯的結果類
            System.CodeDom.Compiler.CompilerResults cResults = iCompiler.CompileAssemblyFromDom(cParams, codeCompileUnit);

            //是否存在錯誤信息
            if (cResults.Errors.HasErrors)
            {
                System.Text.StringBuilder sb = new System.Text.StringBuilder();
                foreach (System.CodeDom.Compiler.CompilerError ce in cResults.Errors)
                {
                    sb.Append(ce.ToString());
                    sb.Append(System.Environment.NewLine);
                }
                throw new Exception(sb.ToString());
            }
            //獲取程序集
            System.Reflection.Assembly assembly = cResults.CompiledAssembly;
            return assembly;

        }

        #endregion


調用事例:性能

            //跨域訪問調用
            System.Reflection.Assembly SPSiteDataAssembly1 = this.CreateWSAssembly("自定義命名空間", "WebService地址", new System.Net.NetworkCredential("用戶名","密碼","域名"));
            //本地調用
            //System.Reflection.Assembly SPSiteDataAssembly = this.CreateWSAssembly("自定義命名空間", "WebService地址", null);
            //得到類型
            Type SiteDataType = SPSiteDataAssembly.GetType("自定義命名空間.類名", true, true);
            //實例對象
            Object SiteData = Activator.CreateInstance(SiteDataType);
            //獲取方法信息
            System.Reflection.MethodInfo mi = SiteDataType.GetMethod("方法名");
            //方法中須要的參數
            Object[] parmas = new Object[] { };
            //調用方法返回結果
            object objresult = mi.Invoke(SiteData, parmas);

Moss 中傳統開發中均可以用。測試

相關文章
相關標籤/搜索