1. 程式人生 > >用WebService傳遞XML資料

用WebService傳遞XML資料

WebService,簡單一點說,就是個對外的介面,裡面有函式可供外部客戶呼叫(注意:裡面同樣有客戶不可呼叫的函式).假若我們是服務端,我們寫好了個webservice,然後把它給了客戶(同時我們給了他們呼叫規則),客戶就可以在從服務端獲取資訊時處於一個相對透明的狀態.即是客戶不瞭解(也不需要)其過程,他們只獲取資料.

Webservice傳遞的資料只能是序列化的資料,典型的就是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就可以了.

《完》

相關推薦

WebService傳遞XML資料

WebService,簡單一點說,就是個對外的介面,裡面有函式可供外部客戶呼叫(注意:裡面同樣有客戶不可呼叫的函式).假若我們是服務端,我們寫好了個webservice,然後把它給了客戶(同時我們給了他們呼叫規則),客戶就可以在從服務端獲取資訊時處於一個相對透明的狀態.即是客

使用WebService傳遞XML格式的字串作為入參時的工具類

在使用webservice的時候,我們有時候需要使用XML格式來進行傳遞入參或者是出參,那麼入參格式怎麼來進行拼接呢? 請看 /** * @Author: yld * @Date: 2018-12-03 10:36 * @Version 1.0 */ public class X

php讀取xml資料

今天工作上碰到一個問題 由於我們的專案資料太少 所以需要從web search那邊借調資料,他們只給我們提供了一個xml的介面。因此,我們需要把xml的資料轉化成html呈現給大家。由於專案是基於php的,所以就摒棄了用js來讀取xml選擇了繼續使用php。不過,我以前從來沒有做過此類的嘗試 所以找

c++程序間通訊 為什麼不能PostMessage傳遞指標資料

1.程序A呼叫CreateFileMapping建立一個記憶體對映檔案。 2.程序A呼叫MapViewOfFile獲取到對映到檔案的記憶體起始地址,呼叫memcpy往記憶體中拷貝資料。 3.程序B呼叫CreateFileMapping開啟程序A建立的記憶體對映檔案。 4.程

HttpWebRequest,HttpWebResponse C# 代碼調webservice,參數為xml

batch 信息 pos tle binding har comm 配置 ebs 先上調用代碼 1 public static string PostMoths(string url, string Json) 2 { 3

調webservice,解析xml屬性值

stack null mls als cep ext XML per exc 1、調用webservice try { String endpoint = "http://22.222.22.22:280/iss-ws/services/SyncU

SpringMVC作為Controller向前端傳遞JSON資料,前端Extjs接收

由於專案需求,前端使用Extjs的treePanel元件做選單,一個與後臺互動的樹形選單需要三個重要的元件: 1、model:model作為資料來源,是將後臺傳過來的json資料與前端統一。 例如:後臺獲取到一組物件集合List< User >,

C# WebService中將集合資料轉化為字串(json,xml )的方式

在寫webservice的時候需要將從資料庫中查詢出的資料(各種集合)轉化為json字串。 如果在取出集合後再對集合進行遍歷,拼接成xml就太麻煩了。 所以首先介紹一下通過標準方法自動轉為json字串。 方法一: 首先需要引入:Newtonsoft.Js

使用webservice返回xml格式資料使用jq解析

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

java實現簡單快速的webservice客戶端/資料採集器(支援soap1.1和soap1.2標準,支援utf-8編碼)

前言: 用了cxf,axis等各種wbeservice實現庫,簡單試用了一下動態呼叫的方式,很不滿意,完全無法滿足業務的需要,所以自己實現了一個webservice採集客戶端,方便動態呼叫外部webservice介面。 一、實現的功能 1、soap1.1客戶端(soap1.

為什麼很多第三方介面,都改成了基於http,直接傳遞json資料的方式來代替webservice?

問題: 曾經不同系統間互動問題時,總是優先考慮webserivce,現在看到除了一些老牌的公司,比如 amazonk 對眾的介面還是webservice的方 式,其他很多國內新專案的介面都開始轉向直接傳 JSON  的方式。我知道的優勢之一,就是webservice的訊息體

Angularjs cors get、post方法與springmvc後傳遞json資料的配置

首先介紹跨域問題,基於安全的考慮,頁面只有在同一個域名下,交流資料,比如網易就不能申請百度的服務(抓取網頁那是另外的技術),ajax也是這個使用範圍,跨域就失效了。 在移動開發中,手機本身就是web站點,後臺pc伺服器是另外一個web站點。這樣就存在跨域問題。 早先用js

Webservice返回json資料格式不帶xml頭部

我將結果內容用字串拼接成Json資料並返回的時候,會在結果前面新增xml頭部,結果如下。 <span ><string xmlns="http://tempuri.org/">   {"data":[{"batchId":"B001","pro

C#開發WEBService服務 C++開發客戶端調WEBService服務

blank 內容 目錄 www nal .net 操作 service服務 3.1 編寫程序 http://blog.csdn.net/u011835515/article/details/47615425 遇到問題及解決方法: HTTP 錯誤 500.19- I

安卓ios和angularjs相互調解決首次調ios傳遞標題失敗的問題

catch ini angualrjs 全局 index als ole ons 客戶 1.angular 調用客戶端方法放在 try catch中 try { js_invoke.sh

ASP.NET JS調WebService——簡單例子

例子 頁面 bsp ima 技術 .com images ebs png 一、創建好WebService 二、編輯頁面與js 三、 運行頁面並點擊按鈕,結果如下 簡單調用吧! ASP.NET JS調用WebService——簡單例子

WebService實現對數據庫進行操作(添加+刪除+修改)(轉)

add exe dispose eth 連接 字段 article log conn 轉自:http://blog.csdn.net/beyondqd/article/details/6703169 表為User,字段有 編號: int id,用戶名:string User

c#調WebService實例

vsp tab width sender pwd 名稱 希望 tar model 在Winform中對數據庫進行操作缺乏安全性,因而可以使用Winform調用WebService來實現對數據庫的各種操作。在VS2010中,創建一個Web服務程序,第一:創建一個空的Web應用

快來看看Google出品的Protocol Buffer,別僅僅會Json和XML

println 輸出流 基本數據類型 下一個 ebr sid 官網 序列 reg 前言 習慣用 Json、XML 數據存儲格式的你們,相信大多都沒聽過Protocol Buffer Protocol Buffer 事實上 是 Google出品的一種輕

ajax 調 webService

mar ext 返回值 前臺 cnblogs chrom 取消 using ucc 前臺腳本 <script type="text/javascript"> $(function () { $.ajax({