wcf長連接


                                                            前言

項目有用到wcf  大體是jquery + webservice + wcf(網頁是客戶端,wcf是服務端),現在需要服務端往客戶端推送信息,本來是用客戶端ajax訪問 2秒一次訪問服務端,后來覺得這辦法不是長久之計,所以百度了下,決定使用comet。

什么是comet?點擊這里!

大概就是:客戶端發送個ajax請求,服務端接收到這個請求后保存這個請求,直到服務端有信息要返回給客戶端或超時(超時時間自己設置,我在例子里設置30秒,不要太久,因為wcf配置也有連接的時間限制),收到信息或超時時限到了時候再重新發起一個ajax請求。

wcf的服務契約:

IService:

 1 [ServiceContract(Name="IService",Namespace="http://www.1.com",SessionMode=SessionMode.Required)]【1】  2     public interface IService
 3     {
 4         [OperationContract]
 5         string Add();
 6 
 7         [OperationContract(AsyncPattern = true)] 8         IAsyncResult BeginAsyn(AsyncCallback userCallback, object stateObject);
 9         string EndAsyn(IAsyncResult asynResult);
10 
11         [OperationContract(IsInitiating=true)]
12         string Init();
13     }

由於是網站項目,服務端需要session的功能,所以【1】SessionMode選擇了SessionMode.Required。Init()是用來初始化session的,通過頭部的[OperationCaontract(IsInitiating=true)]指定。“ 服務端保持客戶端請求,在有需要的時候返回”這是一個異步操作,定義異步行為的是7,8,9三行的代碼,這三行代碼在發布后會生成一個叫做Asyn的方法供客戶端調用。BeginAsyn是客戶端訪問生成的Asyn會首先調用的,EndAsyn是長連接返回時會調用的。即BeginAsyn和EndAsyn就代表Asyn一個方法。

Service:

 1 [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession,
 2         ConcurrencyMode=ConcurrencyMode.Multiple)]【1】  3     public class Service:IService
 4     {
 5         public string Init()
 6         {
 7             return "";
 8         }
 9 
10         public string Add()
11         {
12             if (CacheList.list.Count > 0)
13             {
14                 foreach (var i in CacheList.list)
15                 {
16                     i.repay();
17                 }
18 
19                 CacheList.list.Clear();
20             }
21             
22             return "Add";
23         }
24 
25         public IAsyncResult BeginAsyn(AsyncCallback userCallback, object stateObject)
26         {
27               MYAsynResult asyn = new MYAsynResult(userCallback, stateObject);
28               CacheList.list.Add(asyn);
29               return asyn;
30         }
31 
32         public string EndAsyn(IAsyncResult ar)
33           {
34               //this._stream.EndRead(ar);
35               // this._stream.Close();
36               // return Encoding.ASCII.GetString(this._buffer);
37               return "Asyn";
38           }
39     }

 

上面是服務端的服務具體實現,主要注意的是【1】中的配置ConcurrencyMode=ConcurrencyMode.Multiple(並發模式的設置),如果沒有這一句,你的訪問就還是同步訪問,達不到異步的效果。

寫了一半想了想,由於很多關於wcf配置一些的信息還有具體這個配置原因我也是從別人文章上學習來的,學習的文章講的更清楚,如果要寫這些的話還不如貼出相關文章,所以就想貼出完成wcf異步學習過的文章地址應該會更好點。

有關於wcf session用法點這里  wcf服務端異步點這里 wcf並發點這里這個就是學習步驟,看完應該就都明朗了,也會在文章最后放出完整代碼。【1】需要了解wcf session 因為網站項目 需要session,當然如果自己維護一個也可以,不過我還是選擇wcf提供的方式。【2】需要了解wcf異步因為長連接需要異步,wcf服務異步用到的是IAsyncResult 關於IAsynResult點這里(推薦跟樓主我一樣不太了解的人看看這篇)。【3】異步后就是關於並發的東西(Service貼出的代碼中【1】的配置屬性一開始沒寫進去,導致在測試的時候一直同步的,搞的頭大,后來看文章后才明白怎么回事,所以還是推薦一看wcf並發)。

最后謝謝程序猿.碼農博問里的回答,還有artech的wcf講解。

點擊下載 說明一下:同時運行Hoster和WebApplication1,等WebForm1.aspx里紅色背景的 Login...文字變成Add就可以點擊Add文字了。有什么問題或者可以改的比較好用的地方請留言!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM