之前一直用WCF來開發服務,可是從未用過WebService。對WebService有種很神奇的期待,都說WebService比較簡單,但是從未用過就對我來說就是一種新的知識。起始讓我來說WCF與WebService好壞,其實都差不多吧,隨着時代的變遷,人都向往着新的高深技術,有的時候學習一下基礎的,老一點的知識也是對自己的一種提升。俗話說萬變不離其宗,對我們做編程的也是如此。
最近也一直在看C#與ASp.NET的基礎知識。其實對於基礎知識,我們大眼一看啥都會,可是你深究起來,你就會有種你啥都不會的感覺。打實基礎才能飛的更高更遠,在編程的路上才能走的更遠。
扯遠了,現在開啟正題:創建web服務
首先創建ASP.NET Web 應用程序的項目;然后在其項目下面開始創建服務如WebServiceAccept.asmx文件你會發現在App_Code下面或者直接在打開此文件再進行查看源碼。就可以開始編寫你所要調用的方法了
在WebService中要調用的方法,首先要在方法最上面寫上[WebMethod]例如:
namespace WebServiceApplication { /// <summary> /// WebServiceApplication的摘要說明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消對下行的注釋。 // [System.Web.Script.Services.ScriptService] public class WebService1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld()//被調用的方法*****************************注意方法名不可以重復
{ return "Hello World"; } } }
WebService被調用可以返回不同類型的值,包括DataTable,DataSet,string ,int,double等等類型的值。
OK!Web服務這一塊就先寫到這里,算是比較容易吧,跟平常寫個方法互相調用的關系差不多。下面開始說如何調用WebService
首先你要知道你所調用的方法在哪個頁面中(URL),方法的名字(MethodName)參數object[]paras(給方法傳參數是 )。
1 public class CommonWebService 2 { 3 public static object InvokeCallWebservice(string url,string methodName,object[]paras) 4 { 5 string nameSpace = "Summay";//引用空間名 6 try 7 { 8 //System.Net.WebClient 類的新實例 9 System.Net.WebClient webClient = new System.Net.WebClient(); 10 //向流中讀取WebService中的地址 11 Stream stream = webClient.OpenRead(url + "?WSDL"); 12 //提供一種方法,以創建和格式化用於描述 XML Web services 的有效的 Web 服務描述語言 (WSDL) 文檔文件,該文件是完整的,具有適當的命名空間、元素和屬性。無法繼承此類。 13 ServiceDescription sd = ServiceDescription.Read(stream);//WebService服務說明 14 string className = sd.Services[0].Name;//讀取類的名字 15 ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();//公開一種為 XML Web services 生成客戶端代理類的方法。 16 //將指定的 System.Web.Services.Description.ServiceDescription 添加到要導入的 System.Web.Services.Description.ServiceDescriptionImporter.ServiceDescriptions 17 // 值的集合中。 18 sdi.AddServiceDescription(sd,"",""); 19 20 CodeNamespace cn = new CodeNamespace(nameSpace);//表示命名空間聲明 21 CodeCompileUnit ccu = new CodeCompileUnit();//為 CodeDOM 程序圖形提供容器 22 ccu.Namespaces.Add(cn);//添加空間申明 23 sdi.Import(cn,ccu);//引入控件聲明 24 CSharpCodeProvider csc = new CSharpCodeProvider();//提供對 C# 代碼生成器和代碼編譯器的實例的訪問 25 CompilerParameters cplist = new CompilerParameters();//表示用於調用編譯器的參數 26 cplist.GenerateExecutable = false;//獲取或設置一個值,該值指示是否生成可執行文件; 如果應生成可執行文件,則為 true;否則為 false 27 cplist.GenerateInMemory = true;//獲取或設置一個值,該值指示是否在內存中生成輸出;如果編譯器應在內存中生成輸出,則為 true;否則為 false 28 cplist.ReferencedAssemblies.Add("System.dll");// 添加當前項目所引用的程序集;包含由源引用以進行編譯的程序集名稱 29 cplist.ReferencedAssemblies.Add("System.XML.dll"); 30 cplist.ReferencedAssemblies.Add("System.Web.Service.dll"); 31 cplist.ReferencedAssemblies.Add("System.Data.dll"); 32 //從編譯器返回結果 33 CompilerResults cr = csc.CompileAssemblyFromDom(cplist,ccu); 34 if (cr.Errors.HasErrors)//判斷編譯器返回的結果是否包含錯誤 35 { 36 return null; 37 } 38 Assembly assembly = cr.CompiledAssembly;//加載(獲取或者設置)已經編譯的程序集 39 Type t = assembly.GetType(nameSpace+"."+className,false,true);//獲取程序集具有指定的類的控件名與類的方法名,是否忽略大小寫,在找不到該類型時引發的異常 40 MethodInfo mi = t.GetMethod(methodName);//搜索具有指定名稱的公共方法 41 object obj = Activator.CreateInstance(t);//用指定類型的默認構造函數來創建該類型的實例 42 return mi.Invoke(obj, paras);//使用指定的參數調用當前實例所表示的方法或構造函數並返回該方法的返回值 43 } 44 catch (Exception ex) 45 { 46 return null; 47 } 48 }
執行時需要傳輸URL方法名稱,方法參數。例如:string URL=http://localhost:3083/Readers/DMC_Service.asmx;
object obj=CommonWebService.InvokeCallWebservice(URL,"HelloWorld",new object[]{})
如果需要返回什么樣的值,把object進行轉換即可。
大神勿噴