<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>.NET(Web Service)</title><link>http://blog.blueshop.com.tw/topcat/category/717.aspx</link><description>Web Service開發技術分享</description><managingEditor>topcat</managingEditor><dc:language>zh-TW</dc:language><generator>.Text Version 0.95.2004.101</generator><item><dc:creator>topcat</dc:creator><title>動態的設定WebService的網址</title><link>http://blog.blueshop.com.tw/topcat/archive/2008/05/07/54975.aspx</link><pubDate>Wed, 07 May 2008 11:38:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2008/05/07/54975.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/54975.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2008/05/07/54975.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/54975.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/54975.aspx</trackback:ping><description>&lt;P&gt;使用WebService很方便，透過【加入Web參考】的方式來為我的專案加入WebService。不過由於系統開發過程中，小喵會區分為測試主機與正式主機，因此每次系統要上線的時候，就需要把WebService的參考Server改變。&lt;/P&gt;
&lt;P&gt;這讓小喵開始構思，是否可以動態的告訴WebService應該到哪台Server去啟用執行WebService呢。再進一步，如果我將使用哪一台WebService設定抽離出來，變成一個設定檔。那麼我只需要在測試台與正式台使用不同的設定檔。但是程式卻是可以一致的。&lt;/P&gt;
&lt;P&gt;假設我&lt;/P&gt;
&lt;P&gt;測試環境要去使用 http://localhost/topcat/myWebService.asmx&lt;/P&gt;
&lt;P&gt;正式環境要去使用http://blueshop.com.tw/topcat/myWebService.asmx&lt;/P&gt;
&lt;P&gt;我先寫一個讀取設定檔的Function如下，設定檔中主要是記錄Server名稱或IP&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=vb name=code rows=6 cols=50&gt;   Private Function GetWSUrl() As String
        Dim StrmRd As New StreamReader("WebServiceUrl.ini")
        Dim Line As String = ""
        Dim WSUrl As String = ""
        Try
            Do
                Line = StrmRd.ReadLine()
                If Line &amp;lt;&amp;gt; "" Then
                    WSUrl += Line
                End If
            Loop Until Line Is Nothing
            GetWSUrl = WSUrl

        Catch ex As Exception
            Throw New Exception(ex.Message.ToString)

        Finally
            StrmRd.Close()
            StrmRd.Dispose()
            StrmRd = Nothing

        End Try
    End Function&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;然後我就可以再調用WebService的時候&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA class=vb name=code rows=6 cols=50&gt;Try
    Using obj As New WebReference.PSNDRobot
        obj.Url = "http://" &amp;amp; GetWSUrl() &amp;amp; "/MyWebService.asmx" '在此動態設定WebService
        obj.Discover()  '重新整理WebService
        Dim Rc as String = obj.Test()
    End Using

Catch ex As Exception
    Throw New Exception(ex.Message)
End Try
&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/54975.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>ASP.NET2.0 多層架構的資料溝通介面Object DataSouce</title><link>http://blog.blueshop.com.tw/topcat/archive/2006/02/20/17943.aspx</link><pubDate>Mon, 20 Feb 2006 13:00:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2006/02/20/17943.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/17943.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2006/02/20/17943.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/17943.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/17943.aspx</trackback:ping><description>&lt;P&gt;當我們設計多層式的Web應用系統時，資料的存取不在是直接透過sqlDataSouce來處理，而是透過中間層(商業邏輯層)的Web Service或者是Com+元件來處理&lt;/P&gt;
&lt;P&gt;以往要寫這樣的方式，必須撰寫許多的程式，才能夠實現這樣的架構，而新的ASP.NET 2增加了一個新的Web Control→Object DataSource，可以讓我們寫粉簡短的程式，就能夠做到類似sqlDataSouce的功能，將新增、修改、刪除、查詢包成物件中的方法&lt;/P&gt;
&lt;P&gt;&lt;FONT size=4&gt;&lt;STRONG&gt;建立物件Object&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;首先，必須將透過中間層的元件的新增修改刪除查詢的動作，包裝成為ASP.NET的物件，這樣Object DataSource才能夠使用物件的方式來達到目的方式步驟如下&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;新增一個Class.vb的項目：新增一個與您資料庫溝通的物件，假設名稱為MenuIfno.vb 
&lt;LI&gt;為這個物件建立查詢、新增、修改、刪除的Function，Function的內容就是呼叫您所撰寫的中間層元件(COM+,WebService)，其中查詢的Function必須傳回DataSet或者DataReader，不過由於DataReader必須在讀取的過程中將Connection持續的連接，再此建議大家回傳DataSet 
&lt;LI&gt;假設我已經撰寫好的查詢、修改Function如下 
&lt;OL&gt;
&lt;LI&gt;GetMenuAll()：傳回所有資料表 
&lt;LI&gt;GetMenu(NodeId)：傳回某一筆資料，NodeId為Key值 
&lt;LI&gt;UpdateMenu(NodeId,ParentId,sText,sValue,.....)更新資料&lt;/LI&gt;&lt;/OL&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;FONT size=4&gt;&lt;STRONG&gt;Object DataSource設定&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;接著就是Object DataSouce的設定方式與步驟如下：&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;從控制項中拉除一個sqlDataSource1，透過Smart Tag中的Configure Data Source設定sqlDataSource 
&lt;LI&gt;在Choose your business object中，就可以下拉看到您剛剛所建立的物件【MenuInfo】→Next 
&lt;LI&gt;接著，可以看到有四個頁箋(SELECT,UPDATE,INSERT,DELETE)，可以根據需求，進入各頁箋，選擇所要的Function 
&lt;LI&gt;例如目前要的是一個顯示全部資料的動作，所以就選擇了SELECT對應到GetAllMenu 
&lt;LI&gt;按下Finish就完成了設定&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;資料瀏覽GridView&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;接著就建立一個GridView,並且把DataSource設定為剛剛所建立的object DataSource1,接著直接執行就可以將資料表中的資料顯示出來。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;Detail View單筆資料修改刪除&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;接著我們希望能夠設計一個Detail View將剛剛的Grid View點選的資料顯示在Detail View中作單筆的修改、刪除動作。所以我們將剛剛建立的GridView透過Smart Tag設定Enabled Select Mode。 
&lt;LI&gt;接著建立第二個ObjectDataSource2給Detail View，設定頁箋如下： 
&lt;OL&gt;
&lt;LI&gt;SELECT：GetMenu(NodeId) 
&lt;LI&gt;UPDATE：UpdateMenu(NodeId,ParentId,sText,....) 
&lt;LI&gt;DELETE：DelMenu(NodeId)&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;接著由於SELECT的時候有個參數NodeId，需要設定該參數的來源： 
&lt;OL&gt;
&lt;LI&gt;在Paramenter Source設定為Conrtrol 
&lt;LI&gt;ControlID下拉可以選擇剛剛建立的GridView 
&lt;LI&gt;接著按下Finish建立好該ObjectDataSouce2&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;點選Object DataSource2設定他的屬性【UpdateParameters】： 
&lt;OL&gt;
&lt;LI&gt;點選...進入設定的畫面中 
&lt;LI&gt;選擇NodeId 
&lt;LI&gt;設定Parameter Source為Control 
&lt;LI&gt;設定ControlID為GridView1&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;再來拉出Detail View控制項，將該控制項的DataSource設定為Object DataSource2 
&lt;LI&gt;點選DataView並且設定屬性視窗中找到【DataKeyNames】設定主索引為【NodeId】&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;接著來看看這樣設定的結果，點選某筆資料，就可以在DetailView中顯示該筆資料的內容，並且可以點選編輯，來修改該筆的資料，可以讓我們在撰寫最少的程式下，輕鬆的完成多筆查詢、單筆維護的畫面設計。&lt;/P&gt;&lt;BR&gt;&lt;BR&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/17943.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>topcat</dc:creator><title>Web Service呼叫Web Service使用Transaction確保交易完整性測試報告</title><link>http://blog.blueshop.com.tw/topcat/archive/2005/11/14/14497.aspx</link><pubDate>Mon, 14 Nov 2005 18:50:00 GMT</pubDate><guid>http://blog.blueshop.com.tw/topcat/archive/2005/11/14/14497.aspx</guid><wfw:comment>http://blog.blueshop.com.tw/topcat/comments/14497.aspx</wfw:comment><comments>http://blog.blueshop.com.tw/topcat/archive/2005/11/14/14497.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blog.blueshop.com.tw/topcat/comments/commentRss/14497.aspx</wfw:commentRss><trackback:ping>http://blog.blueshop.com.tw/topcat/services/trackbacks/14497.aspx</trackback:ping><description>&lt;P&gt;前言：&lt;BR&gt;以前設計程式時，是透過ASP,COM+,DB的三層式架構方式來處理資料庫的存取&lt;BR&gt;透過COM+存取的時候，可以透過COM+對於Transaction的支援來處理&lt;BR&gt;因此寫了A元件與B元件，兩個分別維護資料庫DB_A與DB_B&lt;BR&gt;萬一發生錯誤問題的時候，可以透過Transaction的機制將維護過程的資料還原(ROLLBACK)&lt;BR&gt;並且存取資料庫的權限可以透過COM+的Package的識別設定來指定透過某個Windows帳號來存取相關的資料庫&lt;BR&gt;&lt;BR&gt;問題：&lt;BR&gt;目前進入.NET的設計，想尋找是否能夠用Web Service來取代COM+，借以解決.NET設計的COM+設定安裝不易、穿越防火牆安全設定的問題&lt;BR&gt;因此有了以下的兩個問題想請教各位前輩們&lt;BR&gt;1.是否能夠類似COM+的Package，【透過設定】指定某【Windows帳號】來執行相關的資料庫存取的方式&lt;BR&gt;(ps.非固定寫在程式中)&lt;BR&gt;2.是否能夠Web Service呼叫Web Service的過程中，確保雙方的資料異動能夠包在同一個Transaction中，確保異動的完整性&lt;BR&gt;
&lt;HR&gt;
小喵依需求的狀況舉個例子&lt;BR&gt;&lt;BR&gt;以前的Asp三層式架構&lt;BR&gt;&lt;BR&gt;a.asp呼叫COM_A並且維護DB_A的Table_A&lt;BR&gt;在COM_A中又呼叫了另一個COM_B並且維護DB_B中的Table_B&lt;BR&gt;&lt;TEXTAREA class=sql name=code rows=6 cols=50&gt;a.asp-----&amp;gt;COM_A------&amp;gt;DB_A.dbo.Table_A(台北的主機上的資料)
           |
           |
           |
           V
           COM_B------&amp;gt;DB_B.dbo.Table_B(大陸的主機上的資料)
&lt;/TEXTAREA&gt; 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;以前的三層式架構中，可以確保COM_A與COM_B分別維護的資料的完整性&lt;BR&gt;當COM_A,COM_B中的任何一個部份有錯誤發生時，可以SetAbort來將已經部份維護的資料RollBack回去&lt;BR&gt;&lt;BR&gt;由於透過.NET撰寫COM+元件在註冊的過程中有些複雜與麻煩....&lt;BR&gt;但是在運用上卻需要透過這樣的方式來確保資料的完整性&lt;BR&gt;所以想找看看是否能夠透過Web Service的方式來處理&lt;BR&gt;
&lt;HR&gt;

&lt;P&gt;&lt;/P&gt;
&lt;DIV class=PreDiv id=RplBRD20051114153256AKY name="RplBRD20051114153256AKY"&gt;報告一下小喵最近測試的結果&lt;BR&gt;&lt;TEXTAREA class=sql name=code rows=6 cols=50&gt;測試目的：交易的RollBack
測試方式：
1.測試WS_A呼叫WS_B
WS_A：維護DB_A.dbo.TA
WS_B：維護DB_B.dbo.TB,DB_B.dbo.TC
WS_A,WS_B都設定為Requir Transaction
2.
WS_A→
TA:Insert資料正常
WS_B→
TC:Insert資料正常
TB:Insert資料，因Key重複發生錯誤
測試WS_B的TC是否維護進去，WS_A的TA是否維護進去

測試結果：
Try...Catch的Catch中
如果寫【Throw New System.Exception(ex.Message)】
那麼就可以讓
TA,TB,TC都沒有維護成功→有RollBack回去

如過Insert的資料是不會Key重複→資料三個完整的維護進去&lt;/TEXTAREA&gt;&lt;BR&gt;===================================================&lt;BR&gt;&lt;BR&gt;測試到這邊，算是初步的成功，可是以下的測試卻是令人失望&lt;BR&gt;&lt;BR&gt;===================================================&lt;BR&gt;&lt;TEXTAREA class=sql name=code rows=6 cols=50&gt;測試目的：是否包在共同一個交易中，共用資源
測試方式：
1.WS_A：Insert資料到DB_A.dbo.TA
2.WS_A呼叫WS_B
3.WS_B：讀取WS_A中Insert進入的那一筆資料
4.【重點唷】兩個Web_Service都宣告為Required
(理論上兩個應該包成相同的一個交易中，相同的交易應該是共用資源，可以讀取到上一個WS新增的資料)

測試結果：
傳回：逾時

代表雖然宣告為Required,理論上應該是可以共用資源
但是實際測試後發現，運行的時候分別分屬兩個Transaction所以資料並無法視為共同資源運用&lt;/TEXTAREA&gt;&lt;BR&gt;=========================================================================================&lt;BR&gt;據說(不負責任的路邊攤消息)&lt;BR&gt;這個問題將在2007年的Vista Server版本與配合的相關開發工具中獲得解決&lt;BR&gt;&lt;BR&gt;看來目前小喵只能暫時用粉難註冊的COM+來處理目前的需求了&lt;BR&gt;&lt;BR&gt;以上報告完畢&lt;BR&gt;^_^ &lt;/DIV&gt;
&lt;SCRIPT language=JavaScript&gt;
&lt;!--
BShighlight('RplBRD20051114153256AKY');
//--&gt;
&lt;/SCRIPT&gt;&lt;img src ="http://blog.blueshop.com.tw/topcat/aggbug/14497.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>