目前分類: ASP.NET    檢視方式: 列表 摘要
AJAX - Atlas
willeam 在天空部落發表於21:07:14 | ASP.NET

最近越來越多站台在討論有關於AJAX這個技術,由於自己本身對ASP.NET也滿有興趣,所以就詳細的看了一下,發現這是利用XMLHTTP這個元件來達到Clinet-Server之間的資料溝通的另一種方式,有別於透過postback的方式,使用者不會感覺到畫面的更新,對UI來講是一種非常不錯的技術。

在2年多前我與同事也曾經利用此技巧來實作專案,當時還未有AJAX這個名詞出現,不過因為Debug不易,所以並無被大量使用在專案的開發上。

經過了2年多,該技術已經趨近成熟,微軟更為他發展出一套Framework -- 'Atlas',大大的降低了使用者自行使用XMLHTTP元件與Server溝通時的複雜度,相信未來這項技術勢必會對整個Web Application開發帶來一番新局面,請大家拭目以待。

ASP.NET Project 'Atlas' Quickstart Tutorial


如何呼叫含有SoapHeader的Web Service
willeam 在天空部落發表於23:28:47 | ASP.NET

接續上一篇文章"如何建立含SoapHeader的Web Service",此篇文章要大家如何呼叫含有SoapHeader的Web Service,首先要先把上一篇文章建立的Web Service加入Web Reference.

因為我是用WebForm做示範,所以我就將程式碼寫在Page_Load事件裡面.首先我們來看看localhost裡面有哪些class.

我們發現localhost裡面有2個class,這2個class正是我們之前自己建立的class,一個是用來定義SoapHeader的class,另一個是WebService本身的class,為了幫大家回想,我把之前Web Service給貼上來.

 

這2個class其實也就是我們呼叫Web Method需要用到的所有東西了.我們先利用MySoapHeader類別建立一個物件,並且把userid與password填入此物件內.

   localhost.MySoapHeader header = new CallWS_HasSoapHeader.localhost.MySoapHeader();
   header.userid = "admin";
   header.password = "password";

接下來透過Service1類別建立一個物件(此物件內含我們要要呼叫的Helloworld()方法),然後將之前建立的header物件指定給service的MySoapHeaderValue屬性,最後就可以進行Helloworld()方法的呼叫了.

   localhost.Service1 service = new CallWS_HasSoapHeader.localhost.Service1();
   service.MySoapHeaderValue = header;
   Response.Write(service.HelloWorld());

不過上面的程式碼有點詭異,甚麼時候跑出來一個MySoapHeaderValue屬性,其實此屬性是VS.NET自動幫我們產生出來的,當我們透過Add Web Reference將Web Service加入時,VS.NET會自動建立一個Proxy類別,在建立此Proxy類別的時候,因為發現此Web Service含有SoapHeader,所以他就自動以該SoapHeader的型別(當初我們建立的型別為MySoapHeader),後面在多加一個Value來當作指定SoapHeader的屬性,所以就多了一個MySoapHeaderValue屬性,雖然覺得很奇怪那也是沒辦法的事.

呼叫 HelloWorld()方法後我順勢將它印出來畫面上,假如你輸入的帳號密碼沒錯的話,應該就會看到"回傳執行結果"這幾個字.

 


如何建立含SoapHeader的Web Service
willeam 在天空部落發表於23:24:27 | ASP.NET

利用VS.NET來建立Web Service其實是非常簡單的事,不過假如你的Web Service是可以從Internet給他人存取的話,那你可能會想要替你的Web Service加上一些權限的控管,因為畢竟不是所有的人都可以毫無限制的存取你的Web Service,這時候你可以替你的Web Service加上一個SoapHeader,透過SoapHeader來挾帶userid和password的認證訊息,而你就在Web Method裡面判斷userid與password是否正確,如此一來那些沒有正確userid和password的人就無法執行你的Web Service的功能了.

製作含有SoapHeader的Web Service其實也非常簡單,首先我們先看看一開始的WebService都是長甚麼樣子

接下來將Helloworld取消註解,然後Compile並且執行,你會在瀏覽器看到以下畫面

此畫面列出了呼叫Helloworld此WebMethod該傳些甚麼資訊,在畫面中可以看到<soap:Envelope>裡面只有一個子區段<soap:Body>,因為我門還沒有加入soapheader,所以只會有一個<soap:Body>區段.

要加入SoapHeader前必須先定義出此SoapHeader含有哪些元素,而定義的方法其實只是建立一個class而已,只不過此class一定要繼承自SoapHeader類別.

假設我要在SoapHeader裡面傳送userid與password的話,我必須定義一個class如下

 

請注意,SoapHeader類別在System.Web.Services.Protocols命名空間,所以請將它using進來.

定義好要傳送的SoapHeader後,接下來是透過SoapHeaderAttribute將我門自訂的SoapHeader類別指定給Helloworld()方法


進行到這裡後,你可以先Compile一下,重新再執行看看,會發現多了一個<soap:Header>的區塊

這表示以後在呼叫Helloworld這個WebMethod時,必須傳入含有userid與password的SoapHeader.有了此SoapHeader後,我們就可以在Helloworld裡面判斷該userid與password是否合法,假如正確的話才執行接下來的程式碼.

到這裡就算完成了"需要SoapHeader的WebMethod",假如使用者呼叫時未加入SoapHeader的話,就會回傳"未指定帳號密碼"訊息,若是帳號密碼錯誤則回傳"帳號密碼錯誤"訊息.

你可以透過VS.NET所提供的測試介面進行測試,只不過無法測試含有SoapHeader的情況罷了.

 


ASP.NET與ASP的資料交換
willeam 在天空部落發表於22:42:33 | ASP.NET

最近一位客戶需要在ASP裡面呼叫Web Service來幫他進行產品價格的查詢,於是乎我就用ASP.NET建立了一個Web Service來提供給客戶在ASP裡面透過SoapToolKit 3.0來呼叫.

不過因為客戶要傳遞的資料需要可以一次傳遞多筆,然後回傳的資料也是多筆的,並且希望過程中可以不要自己剖析xml, 並且可以將回傳結果直接匯入他們最熟悉的RecordSet物件.這篇文章就是描述如何達成這個任務的過程.

首先,客戶在ASP裡將要查詢的產品代號填入到Recorset物件裡,然後再將Recordset的資料儲存到DOMDocument物件裡面

Set rs = Server.CreateObject("ADODB.RecordSet")
Set oXMLDOMSend = Server.CreateObject("Msxml2.DOMDocument")
rs.Save oXMLDOMSend, 1


然後取出DOMDocument物件的xml字串,此xml字串就是內含多筆資料的查詢字串,接下來就是透擴SoapToolkit將此字串傳送給Web Service

Dim soapClient
set soapclient = CreateObject("MSSOAP.SoapClient")
soapclient.mssoapinit "
http://192.168.0.1/WebService1.wsdl"
soapclient.GetPrice(oXMLDOMSend.xml,result)


在上面的程式碼裡,http://192.168.0.1/webservice1.wsdl是我們用ASP.NET建立的web Service,此Web Service裡面有一個GetPrice()的WebMethod,此WebMethod有2個參數,第一個是傳入給Web Service的查詢字串,內含多筆產品代號,第2個參數則是用來取得查詢結果的字串

接下來用VS.NET建立一個WebService,此Web Service會接受使用者傳入的產品代號,然後查詢完成後在將結果以字串方式回傳

[WebMethod]

public void GetPrice(string xml,out string result)

{....}

因為使用者所傳入的是一個以xml格式的字串,裡面含有使用者要查詢的產品代號,要取出這些資訊最快的方式就是透過DataSet的Loadxml()方法將該字串讀入到DataSet裡面,只要進入到DataSet裡面後,我們就可以很方便的取出裡面的資訊了

   StringReader sr = new StringReader(xml);
   DataSet ds = new DataSet();   
   ds.ReadXml(sr);

因為我們已經將查詢的資訊成功匯入到DataSet了,所以取出查詢的產品代號也不是甚麼大問題了,只要熟悉DataSet的一些架構就可以很簡單的取出想要的資訊.

到這裡其實都還很順利,比較麻煩的其實是在後半段,該如何把查詢完的結果傳回給使用者呢?因為使用者不希望傳回的xml字串還要自己用xpath去剖析,那太累了,最好是可以讓它載入到RecordSet裡面,以方便它接下來取出值.

為了達到使用者的要求,我們必須在ASP.NET裡面建立RecordSet物件,然後將結果塞入到 Recordset物件裡,最後再將RecordSet轉成xml物件回傳給使用者, 如此使用者才能成功把查詢完的結果xml字串匯入到RecordSet物件裡.

想要在ASP.NET裡建立RecordSet物件的話,首先必須加入COM 物件到Reference裡面

另外,後來需要將RecordSet會出成xml字串,所以需要透過DOMDocument物件,此物件是與RecordSet搭配使用,並無法用.NET之XmlDocument物件取代,所以必須加入此物件到Reference.

加入完成後,你將可以在Reference裡看到結果如下

接下來,我們就可以在ASP.NET裡去建立RecordSet物件了.

 MSXML2.DOMDocumentClass dom = new MSXML2.DOMDocumentClass();
 ADODB.RecordsetClass rs = new RecordsetClass();

   rs.Fields.Append("entity", DataTypeEnum.adVarChar, 8, FieldAttributeEnum.adFldUnspecified, Missing.Value);//建立欄位
   rs.Fields.Append("part", DataTypeEnum.adVarChar, 20, FieldAttributeEnum.adFldUnspecified, Missing.Value);
   rs.Fields.Append("site", DataTypeEnum.adVarChar, 8, FieldAttributeEnum.adFldUnspecified, Missing.Value);
   rs.Fields.Append("type", DataTypeEnum.adVarChar, 10, FieldAttributeEnum.adFldUnspecified, Missing.Value);
   rs.Fields.Append("date", DataTypeEnum.adDate, 0, FieldAttributeEnum.adFldUnspecified, Missing.Value);

   rs.CursorLocation = CursorLocationEnum.adUseClient;
   rs.Open(Missing.Value, Missing.Value, CursorTypeEnum.adOpenUnspecified, LockTypeEnum.adLockUnspecified, -1);   
   
   rs.AddNew(Missing.Value, Missing.Value);   //加入新列到rs
   rs.Fields["entity"].Value = "ACL"; //設定新列的值
   rs.Fields["part"].Value = "PCM-5820-E0B2";
   rs.Fields["site"].Value = "4000";
   rs.Fields["type"].Value = "SUPPLY_MRP";
   rs.Fields["date"].Value = "2009-01-05T00:00:00";

  rs.Save(dom,PersistFormatEnum.adPersistXML);
  result = dom.xml;

在上面的程式碼裡,我們不但建立了RecordSet物件,並且還在此RecordSet物件裡建立了一些欄位,接下來則是加入查詢結果到此RecordSet裡,在範例中我直接塞固定值給他,其實應該根據查詢結果跑回圈,一個個將資料塞入到RecordSet物件,當資料完全填入到RecordSet後,再將RecordSet的值轉存到DOMDocument物件中,最後是取出xml字串回傳.

此xml字串回傳給使用者後,使用者可以簡單的以DOMDocument物件的loadXML()將其匯入,然後在利用RecordSet的Open()來開啟此DOMDocument物件,這樣就可以還原回傳的xml字串到RecordSet物件了.

經過這樣多重的轉換後,使用者可以不用自己剖析回傳的字串,大大減輕的他們的負擔,過程中ASP利用SoapToolKit來呼叫ASP.NET寫的WebService,也算是一種讓ASP可以利用到Web Service強大功能的一個solution,對未來要擴充也比較有彈性.

 


系統公告
行事曆
Dec 2009
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
記事分類
我推薦誰
目前無名單
好時光貼曆
誰推薦我
目前無名單
誰來我家
RSS 訂閱
贊助商
其它資訊
本部落所刊登之內容,皆由作者個人所提供,不代表 yam 天空 本身立場。
POWERED BY
POWERED BY 天空部落
會員登入免費註冊