凯锐

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  101 随笔 :: 39 文章 :: 377 评论 :: 25 引用

曾用.NET Remoting,基於IIS,為公司實現過分布式多層架構,客戶端采用Web Browser瀏覽,當時,公司領導告訴我可能會有多臺中間服務器用於系統,又不想每臺電腦的去安裝程序,所以,我最后采用了.NET Remtoing來實現分布式,可直到如今,我也沒有看到有購置多臺中間服務器,哪怕多臺Web服務器的可能性。不過,功能咱是實現了,只要有了機器,俺就用上。先不管他,上博客園來看看,這一看,就看到张逸 赵颉位牛人的“你知道什么是WCF”的訪談錄,看完之后,對於WCF也就躍躍欲試,於是結合张逸以及博客园另一位牛人artech(都是MVP,羨慕中…..)介紹的內容, 加上本人對於Remoting的開發也有一點功底,於是也就沒有花多少時間,鼓搗出以下這個自己號稱目前最先進的基於IISWCF的分布式多層開發架構。

至於WCF的相關知識,咱也不說什么,张逸和Artech這兩位牛人說得已經很是明白了,各位可以通過上面的鏈接去他們的博客上學習啦,不過,感覺有Remoting開發經驗的,對於WCF的相關概念應該不是很難理解。

下面還是用代碼來說明一下(由於這家公司的經理要求使用VB來做,我只好放棄用了近兩年的C#的而改用VB了。還好現在基本上兩種都不會混了,也算是間接的掌握了一門新語言吧,喜歡看C#的朋友就請多擔待,或者留言,本人考盧是否提供一份C#的實現。呵呵:))

1、首先從整體來看這個架構,這個架構的圖示大約如下,共包括了6個專案,大概從專案名稱應該也可看出其主要用途了:


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程序了。

上面簡單介紹了各個專案的用途了,下面我們來分步用VB實現:

2、建立實體對象:

EREmployee

這個基於工具也可產生,網上大把。只是要註意的是,要能在WCF中傳遞的實體,必須是可序列化和序列化了的實體,在Remoting中我們需要在類前面冠上<Serializable()> _這種形式的編程即可,同樣在WCF中我們使用的是<DataContract()> _,然后在屬性前面也加上<DataMember()> _聲明。

3、同樣,我們再接著建立一個Contract,引用第二步建立的實體對象。我們使用類似下面的代碼,這里同樣運用了聲明式的編程方式。各位可以自行比較這些代碼跟我們常用的代碼的寫法的差異。

IEmployee


4、這一步實現很關鍵,能否使用WCF成功,這一步至關重要,我們把對應的類繼承於ClientBase,並實現了HL.Shared.Osp,當然真實方法我們在另一個專案中實現,這里算是一個引子吧,權當我曾經好像看過某位牛人(如果沒有記錯應該也是上面先生寫的一篇文章。關於Remoting的)說的.netRemoting的欺騙吧。你把他當做欺騙也好,什么也好,只是我需要指明的是這個很重要,代碼如下:

BLEmployee


當然,如果我想實現數據庫類型的切換,我以前用Remoting的時候,就在這個類中做手腳,但關於WCF卻感覺無從下手,如果哪位知道,請留言指教,不勝感激。

5、收尾一下4步中遺留的真正實現方法,不多說,直接看代碼:

SQLDaoEmployee


6、至此我們,可以開始配置,基於IISWCF服務端了。請看配置文件

WCF Service
      這個配置文件是2008自動生成的,我沒有做更改,其實,你只需要更改的是<system.serviceModel>這個Selection。當然,在<appSettings>塊中需改動你的數據庫連接字串,這個其實,也不需要我提醒嘍。然后新建一個Svc文件,該文件指明使用的語言和Service的名稱即可,只要一行即可:<%@ ServiceHost Language="VB" Debug="true" Service="HL.DALSQLServer.Osp.SQLDaoEmployee"%>

7、至此,你已經在IIS服務端配置文件憶寫好,剩下就是去的IIS中配置了,這一步,跟平常配置Web程序一樣,沒多大分別。

8、好了,開始寫客戶端程序吧,這個其實很簡單,我也不說什么註意事項了,直接看代碼吧:

FrmEmployee

配置文件也只需注意<system.serviceModel>塊即可.如下所示:

WCFWin


9、說明一下,這個演示中的Demo使用的數據庫文件其實跟我去年寫的一篇WinForm下多层架构的实现使用的是同一個,當然,你也可以在下載專案的HL.Win找到,名稱為: Employee.txt,另外,本人的文筆不怎樣,沒法寫出很漂亮的文章出來,這也是為什么好久沒有寫博客的原因,尤其是這種帶有技朮性的文章。所以,說的不對或不好的地方,望諒解,當然,如果這篇文章能給你學習WCF帶來一點啟發或幫助,那麼也就不枉了我寫這篇文章的初衷了。


程序源文件下載

 

Kingna(jinliangliu#163.com)

2008/4/9於博客園

歡迎轉載,轉載請保留以上信息

 

标签: .NET, WCF, Remoting, VS2008
posted on 2008-04-09 22:54 凯锐 阅读(3720) 评论(15) 编辑 收藏

评论

#1楼 2008-04-09 23:31 jillzhang      
又一个WCF爱好者,支持了
 回复 引用 查看   

#2楼 2008-04-10 00:59 秋千      
换成简体不更好些吗?
 回复 引用 查看   

#3楼 2008-04-10 08:20 李战      
路過,支持。
 回复 引用 查看   

#4楼[楼主] 2008-04-10 08:37 凯锐      
@jillzhang
謝謝!
@秋千
由於是繁體的系統,所以忘了在Word中轉一下啦,抱歉!
@李战
謝謝支持,沒有你的好文采啊,你的<<悟透JavaScript>>可讓我大開眼界了。
 回复 引用 查看   

#5楼 2008-04-10 09:04 生鱼片      
支持下
 回复 引用 查看   

#6楼 2008-04-10 09:22 Ame      
支持
 回复 引用 查看   

#7楼 2008-04-10 09:40 铱星      
全是繁体字,看了头好大,不看了
 回复 引用 查看   

#8楼 2008-04-10 09:42 梁逸晨      
楼主,我在那篇文章的回复已多次阐明,虽然当时才2月,但是绝对是2008年最佳文章莫属。
 回复 引用 查看   

俺是个WCF的新手,运行您的程序时出现下面的错误:

System.ServiceModel.ProtocolException: 远程服务器返回了意外响应: (405) Method Not Allowed。 ---> System.Net.WebException: 远程服务器返回错误: (405) 不允许的方法。
在 System.Net.HttpWebRequest.GetResponse()
在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
--- 内部异常堆栈跟踪的结尾 ---

Server stack trace:
在 System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory factory, WebException responseException)
在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
在 System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
在 System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
在 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
在 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]:
在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
在 HL.Shared.Osp.IEmployee.Query()
在 HL.Business.Osp.BLEmployee.Query() 位置 C:\Users\Administrator\Desktop\hl.wcf\HL.WCF\HL.Business.Osp\BLEmployee.vb:行号 33
在 HL.Win.FrmEmployee.btnQuery_Click(Object sender, EventArgs e) 位置 C:\Users\Administrator\Desktop\hl.wcf\HL.WCF\HL.Win\FrmEmployee.vb:行号 12

能给看看解决一下吗?
 回复 引用   

#10楼 2008-04-10 10:37 scotoma      
博客园里面都是用C#的呢..如果楼主提供C#版本的那就更好了.

谢谢分享呵呵.
 回复 引用 查看   

#11楼[楼主] 2008-04-10 10:45 凯锐      
@WCF菜鸟
你試著在IE或FF中輸入http://localhost/HL.Service/SvcEmployee.svc?wsdl看看,如果還是返回錯誤,估計是你的權限配置問題了。

@scotoma
呵呵....其實VB/C#都一個樣,在這個專案中,我覺得兩個版本真的只是語法上的不同而已。晚上如有時間再來弄個C#版的。
 回复 引用 查看   

#12楼 2008-04-10 10:45 jillzhang      
@WCF菜鸟
你的问题是不是因为代理没有及时更新的缘故,可能是因为服务有变化,但代理没更新,引起的版本控制问题。
 回复 引用 查看   

#13楼 2008-04-10 10:45 lost[未注册用户]
繁體別有一番味道
 回复 引用   

#14楼 2008-04-12 11:28 g[未注册用户]
大陆迟早也要回归繁体的,好像中日韩已经有个决议要统一汉字了
 回复 引用   

@WCF菜鸟
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=138311&SiteID=1&pageid=0
 回复 引用