亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > XML > 正文

XML WebService完全實例詳細解析

2024-09-05 20:55:59
字體:
來源:轉載
供稿:網友

  首先,我們必須了解什么是webservice.就概念上來說,可能比較復雜,不過我們可以有個宏觀的了解:webservice就是個對外的接口,里面有 函數可供外部客戶調用(注意:里面同樣有客戶不可調用的函數).假若我們是服務端,我們寫好了個webservice,然后把它給了客戶(同時我們給了他 們調用規則),客戶就可以在從服務端獲取信息時處于一個相對透明的狀態.即是客戶不了解(也不需要)其過程,他們只獲取數據.

  webservice傳遞的數據只能是序列化的數據,典型的就是xml數據,這里我們也只討論xml數據的傳輸.

  有了一些對xml webservice的初步了解后,我們將切入正題,即是用一個具體的webservice事例的形式來講解具體的webservice用法,用具體的事例來講解一個概念我想怎么也要比單純的說理能讓人容易理解吧.

  這里,我們將以一個簡單的分布式課件搜索系統為例來講解.使用vs2003為編譯環境,c#為語言,sqlservcer2000為數據庫.(這個例子來 源于一位網上朋友的文章的啟發,覺得很能代表webservice的特點,就按那個想法做了這么個系統來示例了)

  首先,明確我們要做什么.我們需要一個對客戶的接口,也就是個站點,我們把它稱做servicegathersite,它是何種形式都無所謂,甚至它本身 并不需要數據庫,它只是提供給用戶一個查詢的接口,真正的服務,普通用戶是不接觸到的.然后,這里我們還需要若干個提供服務的站點,我們可以稱它們為資源 站,這里為簡單起見,假設有兩個資源站,分別叫websitea,websiteb,它們可以是不對外公布的,只是為了豐富查詢數據而存在.最后,是我們 最需要關注的東西---資源站提供給servicegathersite的服務.兩個資源站,就有兩個服務,我們稱為siteaservice和 sitebservice.兩個服務間沒有任何關系,內部提供的方法也完全沒關聯,只是需要把方法如何使用告訴servicegathersite,意思 是,服務只提供查詢接口,返回的數據如何處理,服務本身并不管,全由使用服務的站點分配.

  寫了這么多,算是簡要的介紹了下有關xml webservice的概念和我們這個例子的結構,下篇文章,我們將開始真正進入代碼的設計階段.

  上篇文章介紹了些webservice的基本特性和我們例子的結構,這篇文章我們將開始具體的代碼編寫工作.

  這個專題主要講述的是webservice,因此這里我們的代碼以webservice相關為主,而其他工程,例如:servicegathersite,websitea等,只將簡略介紹.

  在vs2003中,開發一個webservice并不是件困難的事,首先,我們新建一個webservice項目(文件->新建->項目->c#->web服務應用程序)

  建完這個工程,我們將看到一個叫service1.asmx的文件,這就是webservice的標準文件,它也有ui的概念,不過我們一般不關注,因 此,我們查看其cs代碼文件.如果你什么都還沒做的話,將看見一個被注釋掉的helloworld的webmethod,把注釋去掉,在運行,你就可以得 到最簡單的webservice運行實例了.點擊"helloworld"將執行其方法.顯然,這個函數對我們的意義只在于宏觀的了解了下web服務的寫 法.

  下面,我們將開始具體介紹webservice的寫法.在代碼文件里,如果我們寫了一個函數后,希望此函數成為外部可調用的接口函數,我們必須在函數上面 添上一行代碼[webmethod(description="函數的描述信息")],如果你的函數沒有這個申明,它將不能被用戶引用.如:

  [webmethod(description="最簡單的方法")]
  public string helloworld()
  {
  return "hello world";
  }
  這個函數就是外部可調用的接口函數,對用戶來說相當于一個api.如果某用戶在引用了這個服務后,他調用helloworld()方法,他就將獲得"helloworld"這個返回值.
  看到這里,我們是不是發現,其實webservice并不是那么的神秘,它也不過只是個接口,對我們而言,側重點依然是接口函數的編寫.下面,我將給出我們的例子所需要的接口函數.
  [webmethod(description="查詢以獲取需要的課件信息")]
  public xmldatadocument getsiteadata(string assignname)
  {
  xmldatadocument xd=new xmldatadocument(); //
  dataset ds=new dataset();
  cstoreproc cp=new cstoreproc("searchassign");
  cp.addparin("@keywords",sqldbtype.varchar,30,assignname);
  cp.addparout("@res",sqldbtype.int);
  if(cp.selectproc()) //如果執行成功,存儲過程
  {
  cp.mydata.enforceconstraints=false; //不進行格式嚴格檢查
  if((int)cp.getreturnvalue("@res")==-1)
  {
  string xml="";
  xd.loadxml(xml);
  return xd;
  }
  xd=new xmldatadocument(cp.mydata);
  xmlnode root1=xd.documentelement;
  xmlnodelist roots=root1.selectnodes("list");
  foreach(xmlnode roota in roots) //為所有元素加上站點名稱標記
  {
  xmlelement link=xd.createelement("sitename");
  link.innertext=configurationsettings.appsettings["sitename"].tostring();
  roota.appendchild(link);
  }
  return xd;
  }
  else return null;
  }

  這是獲取資源站點信息的一個接口函數.里面大部分的代碼,我想對于有一定asp.net基礎的朋友來說,都應該是一看就明白,這里只說明下cstoreproc,這是我封裝的一個存儲過程類,主要功能是執行各種類型的存儲過程.

  細心的朋友可能會發現這個函數的返回類型似乎比較特殊,是個xml的文檔.我們在前面已經說過,webservice只能傳輸序列化數據,xml顯然滿足 條件,但比如hash表之類的非序列化數據,是不能傳輸的,xml使用最為廣泛,而且考慮到跨平臺應用,所以這里我們只以xml數據的傳輸來示例.

  接上篇文章,我們先簡單解釋下getsiteadata(string assignname)函數.

  函數功能很簡單,只是要返回查詢結果,其數據格式是xmldatadocument.當查詢失敗時(無匹配查詢結果),我們構造一個xml,返回一個空記 錄.否則,我們把查詢后的dataset生成一個xmldatadocument,接下來,由于該項目的需要,我加入了一個循環,添加dataset里所 沒有的節點,站點名稱.在這之后,算是完成了一個符合我們期望格式的xml數據文檔,我們把它返回.

  好了,webservice的方法函數介紹完了(這里還有個web服務方法,稍后介紹),接下來我們的任務是怎么調用它了.首先把webservice的 項目編譯完成,假定我們這個服務是針對資源站點a的,我們不妨稱其為servicea.先單獨運行asmx文件,執行getsiteadata (string assignname)方法,將提示你輸入參數,你輸入要搜索的內容,點確認,將返回給你一個xml數據,并在ie上顯示出來,這就是你搜索到的內容拉.

  這里對servicea的工作再做點介紹,在我們這個項目里,它是資源站點a提供的服務,意思是,它查詢的數據將全來源于站點a,而站點a資源添加在本項目也有專門的工程實現.

  好了,回到正題.這里我介紹vs調用webservice的方法,其實其他平臺的調用方法也是大同小異.首先我們介紹web引用方式,這種方式我強烈建議 調試時使用,非常方便.右擊引用,點添加web引用,輸入你的webservice地址,如:http: //localhost/aspxproject/webservicesolution/sitebservice/service1.asmx,你必 須保證你輸入的webservice存在.然后引用即可,注意:web引用名將作為你加入的webservice的名字空間.比如你輸入了:sitea, 那服務的實例化將是這樣:sitea.service1 servicea=new sitea.service1();(service1是服務的類名).

  完成了這一步,service的調用似乎變的那么簡單,我們已經實現了遠程實例化,接下來的遠程調用也是一樣的容易.下面給出資源采集站servicegathersite的綁定代碼(只采集a站點的信息)

  //綁定數據
  public void binddata()
  {
  servicea=new sitea.service1();
  dataset ds=new dataset();
  xmlnode xmlnode1;
  xmldatadocument xd=new xmldatadocument();
  stringbuilder xmlstring1;
  xmlnode1=servicea.getsiteadata(strsearch);
  if(xmlnode1==null) //--存儲過程執行失敗
  return;
  xmlstring1=new stringbuilder(xmlnode1.outerxml);
  if(xmlstring1.tostring().equals(""))
  return ;
  xd.loadxml(xmlstring1.tostring());
  ds.readxml(new xmlnodereader(xd));
  datagrid1.datasource=ds.tables["list"].defaultview;
  datagrid1.databind();
  }

  此段代碼給出了xml轉化成dataset的解決方案,雖然這不是必須的,但畢竟在asp.net里,dataset占的作用之重,誰都知道的.其他的請 朋友們先看(呵呵,個中高手就免了),在下篇文章中將會有對它的一些解釋與及多服務分布調用的解決方案,寫了三篇了,發現似乎還是有些朋友看的,那我就獻 丑繼續寫下去好了,大家有什么意見也希望提出,在下的理解存在偏駁也再所難免,希望諒解:)

  接上篇文章,我們先簡單說明下綁定函數.首先實例化servicea,這個和一般類的實例化并沒有不同..接下來用xmlnode1來接受函數的返回值,接下來是構造xml,并將其轉化為dataset,這是通用的方法,如果是剛接觸不久的朋友,最好能記下這種方法.

  接下來給出異步調用兩個服務的代碼

  //綁定數據
  public void binddata()
  {
  iasyncresult ar1;
  iasyncresult ar2;
  servicea=new sitea.service1();
  serviceb=new siteb.service1();
  dataset ds=new dataset();
  xmlnode xmlnode1,xmlnode2;
  xmldatadocument xd=new xmldatadocument();
  stringbuilder xmlstring1,xmlstring2;
  //--簡單的異步調用
  ar1=servicea.begingetsiteadata(strsearch,null,null);
  ar2=serviceb.begingetsiteadata(strsearch,null,null);
  xmlnode1=servicea.endgetsiteadata(ar1);
  xmlnode2=serviceb.endgetsiteadata(ar2);
  //----------
  if(xmlnode1==null&&xmlnode2==null) //--存儲過程執行失敗
  return;
  xmlstring1=new stringbuilder(xmlnode1.outerxml);
  xmlstring2=new stringbuilder(xmlnode2.outerxml);
  xmlstring1=makenewxmlstring(xmlstring1,xmlstring2); //生成新的xml
  if(xmlstring1.tostring().equals(""))
  return ;
  xd.loadxml(xmlstring1.tostring());
  ds.readxml(new xmlnodereader(xd));
  datagrid1.datasource=ds.tables["list"].defaultview;
  datagrid1.databind();
  }
  //生成新xml
  public stringbuilder makenewxmlstring(stringbuilder str1,stringbuilder str2)
  {
  str1=str1.replace("","");
  str2=str2.replace("","");
  str1.append(str2.tostring());
  return str1;
  }

  這有兩個需要注意的地方,一個是xml構造,還有就是異步調用的實現,請讀者,自己理解

  下面講下通過dll來引用webservice的方法,我只把流程介紹下.

  首先,在ie輸入服務的地址,如:http://www.xxx.com/service.asmx

  然后寫輸入http://www.xxx.com/service.asmx?wsdl

  打開后,另存為xxx.wsdl

  然后用vs的命令提示符來編譯:wsdl /namespace:sitea servicea.wsdl

  生成名字空間為sitea的代理類

  最后csc /out:servicea.dll /t:library service1.cs ,其中service1.cs為代理類文件

  最后引用dll就可以了.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品极品尤物在线观看| 亚洲奶大毛多的老太婆| 国产精品爽黄69天堂a| 亚洲成人免费在线视频| 激情av一区二区| 136fldh精品导航福利| 国产精品大陆在线观看| 91豆花精品一区| 欧美日本中文字幕| 欧美大全免费观看电视剧大泉洋| 亚洲性生活视频在线观看| 中文在线不卡视频| 国产97在线亚洲| 久久精品中文字幕免费mv| 精品国产福利视频| 免费av一区二区| 亚洲已满18点击进入在线看片| 亚洲精品99久久久久| 亚洲色图欧美制服丝袜另类第一页| 久久免费视频网站| 国产69久久精品成人看| 欧美成人免费观看| 成人性生交大片免费看小说| 97视频在线观看视频免费视频| 日韩精品中文字幕久久臀| 米奇精品一区二区三区在线观看| 久久久久北条麻妃免费看| 国产亚洲人成a一在线v站| 亚洲高清色综合| 成人免费淫片视频软件| 成人激情视频在线观看| 毛片精品免费在线观看| 亚洲激情中文字幕| 国产视频久久久久| 亚洲国产97在线精品一区| 欧美成人精品激情在线观看| 久久久久国产视频| 亚洲福利视频久久| 国产成人精品视频在线| 2019国产精品自在线拍国产不卡| 日韩av免费一区| 欧美日韩亚洲视频| 国产精品久久久久久久久久久久| 日韩精品丝袜在线| 91在线观看免费网站| 97视频网站入口| 欧美自拍视频在线| 一本色道久久88亚洲综合88| 亚洲一区二区三区xxx视频| 久久久久www| 亚洲欧美综合v| 性金发美女69hd大尺寸| 九九热这里只有精品6| 亚洲欧美变态国产另类| 亚洲综合在线中文字幕| 国自产精品手机在线观看视频| 久久精品成人一区二区三区| 亚洲三级 欧美三级| 波霸ol色综合久久| 久久精品视频99| 久久色在线播放| 91精品美女在线| 亚洲最新av在线网站| 色老头一区二区三区在线观看| 国产欧美日韩综合精品| 亚洲欧美日韩一区在线| 91在线看www| 欧美激情在线一区| 成人有码在线播放| 国产精品久久久久久久久免费看| 欧美日韩国产999| 国产精品久久久久久久天堂| 日本老师69xxx| 欧美极品xxxx| 欧美国产日韩xxxxx| 精品亚洲精品福利线在观看| 久热99视频在线观看| 欧美久久久精品| 亚洲精品美女免费| 欧美成人精品在线| 97在线精品视频| 国内精品久久久久影院优| 中日韩午夜理伦电影免费| 亚洲欧美日韩精品久久奇米色影视| 亚洲男人第一网站| 国产精品丝袜高跟| 日本中文字幕不卡免费| 深夜福利一区二区| 欧美影院久久久| 亚洲男子天堂网| 亚洲欧美国产高清va在线播| 国产一区二区三区毛片| 91久久综合亚洲鲁鲁五月天| 亚洲精品一区中文| 揄拍成人国产精品视频| 国产精品偷伦一区二区| 日韩av在线资源| 国产精品国产福利国产秒拍| 欧美一级视频在线观看| 国产亚洲欧洲高清| 亚洲精品少妇网址| 91成人福利在线| 成人日韩av在线| 在线亚洲国产精品网| 国产99久久精品一区二区永久免费| 久久中文字幕在线视频| 国产精品女人久久久久久| 亚洲欧美色婷婷| 色综合老司机第九色激情| 欧美国产精品日韩| 最近更新的2019中文字幕| 亚洲精品美女网站| 欧美大片第1页| 日韩精品www| 91精品国产自产在线| 日韩动漫免费观看电视剧高清| 国产精品电影在线观看| 九九热精品视频国产| 国产精品1区2区在线观看| 日韩免费高清在线观看| 日韩一中文字幕| 色诱女教师一区二区三区| 欧美激情久久久久久| 综合欧美国产视频二区| 久久久人成影片一区二区三区观看| 亚洲国产天堂久久综合| 国产综合在线看| 少妇高潮 亚洲精品| 91免费精品国偷自产在线| 国产精品99久久久久久白浆小说| 亚洲第一天堂无码专区| 欧美成人免费全部| 97超级碰在线看视频免费在线看| 欧美成人在线影院| 精品国内自产拍在线观看| 91高清在线免费观看| 亚洲国产成人久久综合| 久久天天躁狠狠躁夜夜爽蜜月| 在线日韩日本国产亚洲| 久久久久久久激情视频| 一区二区三区 在线观看视| 欧美国产日韩免费| 国产精品日韩在线观看| 日韩中文在线视频| 国产精品美女久久久免费| 亚洲男女自偷自拍图片另类| 国产视频福利一区| 午夜精品久久久久久久久久久久久| 精品国产一区二区三区久久狼5月| 国产精品免费看久久久香蕉| 欧美日韩另类在线| 黑人精品xxx一区| 久久久久久久久国产精品| 亚洲一区二区三区乱码aⅴ蜜桃女| 精品高清美女精品国产区| 国产成人综合一区二区三区| 亚洲www在线观看| 久久久综合免费视频| 亚洲精品美女久久| 精品亚洲永久免费精品| 国产丝袜一区二区| 亚洲电影免费观看高清完整版在线观看| 亚洲欧美日韩另类| 日韩欧美一区二区三区久久|