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 中傳統開發中均可以用。測試