曾用.NET Remoting,基於IIS,為公司實現過分布式多層架構,客戶端采用Web Browser瀏覽,當時,公司領導告訴我可能會有多臺中間服務器用於系統,又不想每臺電腦的去安裝程序,所以,我最后采用了.NET Remtoing來實現分布式,可直到如今,我也沒有看到有購置多臺中間服務器,哪怕多臺Web服務器的可能性。不過,功能咱是實現了,只要有了機器,俺就用上。先不管他,上博客園來看看,這一看,就看到张逸 赵颉位牛人的“你知道什么是WCF”的訪談錄,看完之后,對於WCF也就躍躍欲試,於是結合张逸以及博客园另一位牛人artech(都是MVP,羨慕中…..)介紹的內容, 加上本人對於Remoting的開發也有一點功底,於是也就沒有花多少時間,鼓搗出以下這個自己號稱目前最先進的基於IISWCF的分布式多層開發架構。jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
至於WCF的相關知識,咱也不說什么,张逸和Artech這兩位牛人說得已經很是明白了,各位可以通過上面的鏈接去他們的博客上學習啦,不過,感覺有Remoting開發經驗的,對於WCF的相關概念應該不是很難理解。jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
下面還是用代碼來說明一下(由於這家公司的經理要求使用VB來做,我只好放棄用了近兩年的C#的而改用VB了。還好現在基本上兩種都不會混了,也算是間接的掌握了一門新語言吧,喜歡看C#的朋友就請多擔待,或者留言,本人考盧是否提供一份C#的實現。呵呵:))jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
<!--[if !supportLists]-->1、<!--[endif]-->首先從整體來看這個架構,這個架構的圖示大約如下,共包括了6個專案,大概從專案名稱應該也可看出其主要用途了:jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
HL.EntityReflect.Osp專案實現是實體對象化。HL.Shared.Osp就是WCFContract了,於了Remoting來說,就是一個建議在Server端實現的接口了,其實為了安全性著想,對於WCF,本人也建議使用接口,在Server端實現。HL.Business.Osp就是我們常說的邏輯業務層,它主要負責調用HL.DALSQLServer.Osp真正實現了HL.Shared.Osp的方法。最后兩個HL.ServiceHL.Win不用我說,各位也可想到一個是IIS HostWCF及客戶端的Winform程序了。jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
上面簡單介紹了各個專案的用途了,下面我們來分步用VB實現:jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
<!--[if !supportLists]-->2、<!--[endif]-->建立實體對象:jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
EREmployeejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports Systemjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports System.Runtime.Serializationjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
'/ <summary>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
'
/ Summary description for EREmployee.jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
'
/ </summary>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
<Serializable()> _jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
<DataContract()> _jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Public Class EREmployeeClass EREmployeejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Sub New() Sub New()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Subjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Private _strbs_no As Stringjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Private _strbs_name As Stringjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
<DataMember()> _jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Property strBS_NO()Property strBS_NO() As Stringjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Getjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
Return Me._strbs_nojæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
End Getjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Set(ByVal value As String)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
Me._strbs_no = valuejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
End Setjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Propertyjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
<DataMember()> _jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Property strBS_NAME()Property strBS_NAME() As Stringjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Getjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
Return Me._strbs_namejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
End Getjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Set(ByVal value As String)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
Me._strbs_name = valuejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
End Setjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Propertyjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
End Classjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
這個基於工具也可產生,網上大把。只是要註意的是,要能在WCF中傳遞的實體,必須是可序列化和序列化了的實體,在Remoting中我們需要在類前面冠上<Serializable()> _這種形式的編程即可,同樣在WCF中我們使用的是<DataContract()> _,然后在屬性前面也加上<DataMember()> _聲明。jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
<!--[if !supportLists]-->3、<!--[endif]-->同樣,我們再接著建立一個Contract,引用第二步建立的實體對象。我們使用類似下面的代碼,這里同樣運用了聲明式的編程方式。各位可以自行比較這些代碼跟我們常用的代碼的寫法的差異。jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
IEmployeejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports Systemjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports System.ServiceModeljæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports HL.EntityReflect.Ospjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
'/ <summary>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
'
/ Summary description for IEmployee.jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
'
/ </summary>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
<CLSCompliant(False)> _jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
<ServiceContract()> _jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Public Interface IEmployeeInterface IEmployeejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
<OperationContract()> _jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Function Query()Function Query() As EREmployee()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
<OperationContract()> _jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Sub Add()Sub Add(ByVal er As EREmployee)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
<OperationContract()> _jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Sub Modify()Sub Modify(ByVal er As EREmployee, ByVal strBS_NO As String, ByVal strBS_Name As String)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
<OperationContract()> _jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Sub Del()Sub Del(ByVal er As EREmployee)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
<OperationContract()> _jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Function fAdd()Function fAdd(ByVal intX As Integer, ByVal intY As Integer) As Integerjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
End Interfacejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
<!--[if !supportLists]-->4、<!--[endif]-->這一步實現很關鍵,能否使用WCF成功,這一步至關重要,我們把對應的類繼承於ClientBase,並實現了HL.Shared.Osp,當然真實方法我們在另一個專案中實現,這里算是一個引子吧,權當我曾經好像看過某位牛人(如果沒有記錯應該也是上面張先生寫的一篇文章。關於Remoting的)說的.netRemoting的欺騙吧。你把他當做欺騙也好,什么也好,只是我需要指明的是這個很重要,代碼如下:jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
BLEmployeejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports System.ServiceModeljæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports System.ServiceModel.Channelsjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports HL.EntityReflect.Ospjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports HL.Shared.Ospjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports System.Data.SqlClientjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Public Class BLEmployeeClass BLEmployeejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Inherits ClientBase(Of IEmployee)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Implements IEmployeejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Sub New() Sub New()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
MyBase.New()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Subjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Sub New() Sub New(ByVal endpointConfigurationName As String)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
MyBase.New(endpointConfigurationName)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Subjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Sub Add()Sub Add(ByVal er As EREmployee) Implements IEmployee.Addjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
        Channel.Add(er)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Subjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Sub Del()Sub Del(ByVal er As EREmployee) Implements IEmployee.Deljæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
        Channel.Del(er)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Subjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Sub Modify()Sub Modify(ByVal er As EREmployee, ByVal strBS_NO As String, ByVal strBS_Name Asjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
String) Implements IEmployee.Modifyjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
        Channel.Modify(er, strBS_NO, strBS_Name)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Subjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Function Query()Function Query() As EREmployee() Implements IEmployee.Queryjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Return Channel.Query()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Functionjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Function fAdd()Function fAdd(ByVal intX As Integer, ByVal intY As Integer) As Integer Implements IEmployee.fAddjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Return Channel.fAdd(intX, intY)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Functionjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
End Classjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
當然,如果我想實現數據庫類型的切換,我以前用Remoting的時候,就在這個類中做手腳,但關於WCF卻感覺無從下手,如果哪位知道,請留言指教,不勝感激。jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
<!--[if !supportLists]-->5、<!--[endif]-->收尾一下4步中遺留的真正實現方法,不多說,直接看代碼:jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
SQLDaoEmployeejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports System.Datajæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports System.Data.SqlClientjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports System.Textjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports HL.EntityReflect.Ospjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Imports HL.Shared.Ospjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
Public Class SQLDaoEmployeeClass SQLDaoEmployeejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Implements IEmployeejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public ReadOnly Property strConn()Property strConn() As Stringjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Getjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
Return Configuration.ConfigurationManager.AppSettings("strConnectNorthWind")jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
End Getjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Propertyjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Sub Add()Sub Add(ByVal er As EREmployee) Implements IEmployee.Addjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Dim strSql As String = "Insert Into Employee(BS_NO,BS_NAME) Values(@BS_NO,@BS_NAME)"jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Using Conn As New SqlConnection(strConn)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
Using Comm As New SqlCommand(strSql, Conn)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Comm.Parameters.Add(
New SqlParameter("@BS_NO", SqlDbType.VarChar, 10))jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Comm.Parameters.Add(
New SqlParameter("@BS_NAME", SqlDbType.VarChar, 20))jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Comm.Parameters(
"@BS_NO").Value = er.strBS_NOjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Comm.Parameters(
"@BS_NAME").Value = er.strBS_NAMEjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Conn.Open()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Comm.ExecuteNonQuery()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Conn.Close()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
End Usingjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
End Usingjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Subjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Sub Del()Sub Del(ByVal er As EREmployee) Implements IEmployee.Deljæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Dim strSql As String = "Delete from  Employee where BS_NO ='" & er.strBS_NO & "' and BS_NAME='"jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
& er.strBS_NAME & "'"jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Using Conn As New SqlConnection(strConn)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
Using Comm As New SqlCommand(strSql, Conn)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Conn.Open()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Comm.ExecuteNonQuery()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Conn.Close()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
End Usingjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
End Usingjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Subjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Sub Modify()Sub Modify(ByVal er As EREmployee, ByVal strBS_NO As String, ByVal strBS_Name Asjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
String) Implements IEmployee.Modifyjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Dim strSql As String = "  update  Employee set BS_NO='" & strBS_NO & "', BS_NAME= '" & strBS_Name & _jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                             
"' where BS_NO ='" & er.strBS_NO & "' and BS_NAME='" & er.strBS_NAME & "'"jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Using Conn As New SqlConnection(strConn)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
Using Comm As New SqlCommand(strSql, Conn)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Conn.Open()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Comm.ExecuteNonQuery()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Conn.Close()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
End Usingjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
End Usingjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Subjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Function Query()Function Query() As EREmployee() Implements IEmployee.Queryjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Dim lst As New List(Of EREmployee)()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Dim strSql As String = "Select * From Employee"jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Using Conn As New SqlConnection(strConn)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
Using Comm As New SqlCommand(strSql, Conn)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Conn.Open()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
               
Dim Reader As SqlDataReader = Comm.ExecuteReader()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
               
While Reader.Read()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                   
Dim er As New EREmployee()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                    er.strBS_NO
= DirectCast(Reader("BS_NO"), String)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                    er.strBS_NAME
= DirectCast(Reader("BS_NAME"), String)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                    lst.Add(er)jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
               
End Whilejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
                Conn.Close()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
End Usingjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
End Usingjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Return lst.ToArray()jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Functionjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
Public Function fAdd()Function fAdd(ByVal intX As Integer, ByVal intY As Integer) As Integer Implements IEmployee.fAddjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
Return intX + intYjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
End Functionjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
End Classjæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
<!--[if !supportLists]-->6、<!--[endif]-->至此我們,可以開始配置,基於IISWCF服務端了。請看配置文件jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
WCF Servicejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
<?xml version="1.0"?>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
<!--jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
    Note: As an alternative to hand editing this file you can use the jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
    web admin tool to configure settings for your application. Usejæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
    the Website->Asp.Net Configuration option in Visual Studio.jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
    A full list of settings and comments can be found in jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
    machine.config.comments usually located in jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
    \Windows\Microsoft.Net\Framework\v2.x\Config jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
-->jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
<configuration>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
<configSections>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
     
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
         
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
         
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
<section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
         
</sectionGroup>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
</sectionGroup>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
     
</sectionGroup>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
</configSections>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
 
<system.serviceModel>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
<services>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
     
<service name="HL.DALSQLServer.Osp.SQLDaoEmployee" behaviorConfiguration="ServiceBehavior">jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
<!-- Service Endpoints -->jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
<endpoint address="" binding="basicHttpBinding" contract="HL.Shared.Osp.IEmployee">jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
         
<!-- jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
              Upon deployment, the following identity element should be removed or replaced to reflect the jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
              automatically.jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
         
-->jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
         
<identity>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
           
<dns value="localhost"/>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
         
</identity>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
</endpoint>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
     
</service>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
</services>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
<behaviors>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
     
<serviceBehaviors>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
<behavior name="ServiceBehavior">jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
         
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
         
<serviceMetadata httpGetEnabled="true"/>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
         
<!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
         
<serviceDebug includeExceptionDetailInFaults="false"/>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
</behavior>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
     
</serviceBehaviors>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
</behaviors>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
 
</system.serviceModel>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
 
<appSettings>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
<add key ="strConnectNorthWind" value ="Data Source=dg;Initial Catalog=Northwind;User ID=sa;Password="/>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
 
</appSettings>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
<connectionStrings/>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
   
<system.web>jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
<!--jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
            Set compilation debug="true" to insert debugging jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
            symbols into the compiled page. Because this jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
            affects performance, set this value to true only jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
            during development.jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
            Visual Basic options:jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
            Set strict="true" to disallow all data type conversions jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
            where data loss can occur. jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
            Set explicit="true" to force declaration of all variables.jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
       
-->jæ/Vr‰aԞwww.netcsharp.cnÇ{’©%¢ÄØG
&