會員權益 我的購物車 如何買書 訂閱電子報 讀者回函
 
 
 
 
 
 
帳號:
密碼:
 

>>加入會員!

 
忘記密碼? 會員專區
 

ASP.NET MVC 開發心得分享:Action 要小心使用 using

今天在 Code Review 的時候抓到一支程式臭蟲,這個功能是某 ASP.NET MVC 專案中的一個匯出下載檔案功能,該功能的 Action ...more

黃保翕(Will保哥) 2010/08/26
 
小編:Vicky
以獨特的視角,帶你發現生活中的無窮樂趣
生活的美妙並不是因為美麗景物,而是與我們身邊的人之間的互動,所產生的笑容跟剎那的記憶有關。要想將生活中珍貴的一面記憶下來,就只能靠日記或是照片了。

在NAVER網站上活躍的
...more
 
       
胡百敬 許薰尹
鄭淑芬 李啟宏
宋志峰 邱世華
呂高旭 陳永昇
麻理鈴 程杰
趙敏翔 羅慧真
更多部落格
 
回首頁 回上一頁
 
類別 >網頁開發
 
WCF初體驗
李漢宗 2007/12/27
WCF是.NET Framework 3.0三個重要的技術之一,可以說是Web Service、TCP、Microsoft Message Queue(MSMQ)、WSE、Enterprise Service以及.NET Remoting技術的集合,它提供訊息安全性、支援交易、服務描述、服務版本管理等功能,透過一些設定讓訊息通訊的實作可以簡化。在WCF中,服務透過Address的定義來描述服務的位址,透過Binding來服務如何提供服務的內容,透過Contract來描述服務的內容。舉例來講,當要打電話給銀行詢問網路銀行服務(Contract)時,透過電話對談,首先會撥打電話號碼(Address),然後銀行服務人員會告知是臨櫃申辦(Binding);還是線上申辦(另一種Binding)的方法。

透過ABC的設定(ABC這三部份是WCF非常重要的部份),讓整個WCF可以提供多種不同的服務方式以及內容。它對Web Service、TCP、Microsoft Message Queue(MSMQ)、WS-*以及.NET Remoting等技術提供了支援。以下是WCF的架構圖:
 
與其他技術的比較:
WCF的結構採用的是「合約為主」(Contract-first)的開發方式。透過這樣的開發方式,首先要定義的是服務通訊所需的介面以及合約。
 
讓我們實際設計一個WCF Service,首先開啟Visual Studio 2005,在網站樣板中選擇WCF Service,然後將WCF Service專案命名為WCF_Demo(如果你的樣板中沒有WCF Service的樣板,請至Visual Studio 2005 extensions for .NET Framework 3.0 (WCF & WPF), November 2006 CTP下載安裝後,就會有WCF Service樣板)。
 
 
當按下OK後,Visual Studio 2005會建立一個WCF Service,然後首先我們會看到的是Service.vb檔案,這個檔案中我們會看到下列的程式碼:
 

Imports System
Imports System.ServiceModel
Imports System.Runtime.Serialization

' A WCF service consists of a contract (defined below as IMyService),
' a class which implements that interface (see MyService),
' and configuration entries that specify behaviors associated with
' that implementation (see <system.serviceModel> in web.config)

<ServiceContract()> _
Public Interface IMyService

  <OperationContract()> _
 Function MyOperation1(ByVal myValue1 As String) As String

  <OperationContract()> _
 Function MyOperation2(ByVal dataContractValue1 As DataContract1) As String

End Interface

Public Class MyService
 Implements IMyService

 Public Function MyOperation1(ByVal myValue1 As String) As String Implements
IMyService.MyOperation1
  Return "Hello: " + myValue1
 End Function

 Public Function MyOperation2(ByVal dataContractValue1 As DataContract1) As String Implements IMyService.MyOperation2
  Return "Hello: " + dataContractValue1.FirstName
 End Function

End Class

<DataContract()> _
Public Class DataContract1
 Private m_firstName As String
 Private m_lastName As String

 Public Property FirstName() As String
  Get
   Return m_firstName
  End Get
  Set(ByVal value As String)
   m_firstName = value
  End Set
 End Property

 Public Property LastName() As String
  Get
   Return
m_lastName
  End Get
  Set(ByVal value As String)
   m_lastName = value
  End Set
 End Property

End Class

 
在服務合約中定義了一個IMyService,其中包含了兩個OperationContract,一個叫作MyOperation1,另一個則為MyOperation2,接下來則是上述兩個OperationContract的函式實作,最後則是DataContract,在其中定義了兩個屬性─FirstName以及LastName。在這裡我們按F5執行,你會發現IE會直接開啟http://localhost:15747/WCF_Demo/Service.svc的網址(這裡的port可能會跟筆者的不同),這看起來很像Web Service:
 
 
仔細看看網頁上的範例內容,看完後,接下來將這個網頁關閉,然後在專案的Web.config檔案中,加入下列粗體字程式碼:
 
  <serviceBehaviors>
   <behavior name="returnFaults">
   <serviceDebug includeExceptionDetailInFaults="true" />
   <serviceMetadata httpGetEnabled="true" />
   </behavior>
  </serviceBehaviors>
 
加入這一段讓我們可以從網頁上看到服務的中繼資料(metadata),在服務執行後,可以在網頁上看到
svcutil.exe http://localhost:15747/WCF_Demo/Service.svc?wsdl這一段程式碼,按下超連結後,我們可以看到服務的相關資料以XML的方式呈現:
 
 
為什麼要設定這個屬性?通常都是拿來偵錯使用,所以在正式環境上,請將這個屬性值設定為false,或是移除。
 
接下來我開啟另一個專案來呼叫這個服務。選擇ASP.NET Web Application樣板,然後將此專案名稱命名為CallWCF。按下OK。
 
 
然後在網頁上擺上一個TextBox以及一個Button:
 
 
接下來在CallWCF專案上按右鍵,選擇Add Service Reference。
 
 
然後在視窗中輸入剛剛那個WCF Service網頁的網址,以及參考服務的名稱(這裡我們用預設值)。
 
 
按下OK後,你會發現CallWCF專案中新增了一個Service Reference的資料夾,然後你再去看看web.config中,也出現了WCF Service的一些相關設定。在Web.config設定中,我們在<system.serviceModel>區段中可以看到Binding以及Address的設定。
 
接下來在Button的Click事件中輸入如下的程式碼:
 
Protected Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
Button1.Click
  Dim localhost As New localhost.MyServiceClient
  Response.Write(localhost.MyOperation1(TextBox1.Text))
 End Sub
 
這段程式碼是將TextBox輸入的字串當成參數傳送給MyOperation1函式,經過處理後,會回傳Hello:(輸入的參數)。實際上執行看看,在TextBox中輸入John,可以看到如下的畫面:
 
 
關閉這個網頁,回到剛剛Button的Click事件中,在程式碼中的MyServiceClient上按下F12,這邊可以看到在localhost.map下還有一個localhost.vb檔案,這個檔案就是使用在我們和WCF Service溝通的代理類別(proxy class),透過這個類別,可以知道WCF Service上提供的服務相關內容。而且這一個檔案是在新增服務參考後自動產生的,所以在這裡不適合做任何的變更,因為任何的變更都有可能被後來所產生的服務參考檔案所覆蓋。
 
這篇文章簡單的介紹WCF Service,在未來我們會深入探討WCF的相關議題。對WCF有興趣的朋友,別忘了繼續觀看這一系列的文章。
 

  回首頁關於悅知聯絡我們
電話:02-2719-8811 傳真:02-2719-7980 地址:105台北市松山區復興北路99號12樓
copyright © 精誠資訊股份有限公司 悅知文化 All rights reserved