1. 程式人生 > >asp.net web 通過IHttpAsyncHandler接口進行消息推送

asp.net web 通過IHttpAsyncHandler接口進行消息推送

authent div reg ret back sig sts content validate

1.創建Comet_by_ASP.NET web項目
2.handler類和result類
namespace Handle
{
    /// <summary>
    /// Summary description for AsnyHandler
    /// </summary>
    public class AsnyHandler : IHttpAsyncHandler
    {
        public AsnyHandler()
        {
        }

        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object
extraData) { //myAsynResult為實現了IAsyncResult接口的類,當不調用cb的回調函數時,該請求不會返回到給客戶端,會一直處於連接狀態 myAsynResult asyncResult = new myAsynResult(context, cb, extraData); String content = context.Request.Params["content"]; //向Message類中添加該消息 Messages.Instance().AddMessage(content, asyncResult);
return asyncResult; } #region 不必理會 public void EndProcessRequest(IAsyncResult result) { } public bool IsReusable { get { return false; ; } } public void ProcessRequest(HttpContext context) { }
#endregion } public class myAsynResult : IAsyncResult { bool _IsCompleted = false; private HttpContext context; private AsyncCallback cb; private object extraData; public myAsynResult(HttpContext context, AsyncCallback cb, object extraData) { this.context = context; this.cb = cb; this.extraData = extraData; } private string _content; public string Content { get { return _content; } set { _content = value; } } #region IAsyncResult接口 public object AsyncState { get { return null; } } public System.Threading.WaitHandle AsyncWaitHandle { get { return null; } } public bool CompletedSynchronously { get { return false; } } public bool IsCompleted { get { return _IsCompleted; } } #endregion //在Message類中的添加消息方法中,調用該方法,將消息輸入到客戶端,從而實現廣播的功能 public void Send(object data) { context.Response.Write(this.Content); if (cb != null) { cb(this); } _IsCompleted = true; ; } } } 3.Messages類 using Handle; using System; using System.Collections.Generic; using System.Web; namespace Handle { /// <summary> /// Summary description for Messages /// </summary> public class Messages { //記錄所有請求的客戶端 List<myAsynResult> clients = new List<myAsynResult>(); #region 實現該類的單例 private static readonly Messages _Instance = new Messages(); private Messages() { } public static Messages Instance() { return _Instance; } #endregion public void AddMessage(string content, myAsynResult asyncResult) { //當傳入的內容為"-1"時,表示為建立連接請求,即為了維持一個從客戶端到服務器的連接而建立的連接 //此時將該連接保存到 List<myAsynResult> clients中,待再有消息發送過來時,該連接將會被遍歷,並且會將該連接輸出內容後,結束該連接 if (content == "-1") { clients.Add(asyncResult); } else { //將當前請求的內容輸出到客戶端 asyncResult.Content = content; asyncResult.Send(null); //否則將遍歷所有已緩存的client,並將當前內容輸出到客戶端 foreach (myAsynResult result in clients) { result.Content = content; result.Send(null); } //清空所有緩存 clients.Clear(); } } } } 4.Default.aspx <%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <style type="text/css"> *{ font-size:12px;} #divResult { border:1px solid #000; width:250px; } </style> <script type="text/javascript" src="Scripts/jquery-1.10.2.min.js"></script> <script type="text/javascript" src="Scripts/myJS.js"></script> </head> <body> 廣播內容: <input type="text" id="content" /><br /> 消息記錄: <div id="divResult"></div> <input type="button" id="btnSend" value="廣播" /> </body> </html> 5.myjs類 /// <reference path="jquery-1.3.2.min.js" > $(document).ready(function () { function send() { //向comet_broadcast.asyn發送請求,消息體為文本框content中的內容,請求接收類為AsnyHandler $.post("comet_broadcast.asyn", { content: $("#content").val() }); //清空內容 $("#content").val(""); } function wait() { $.post("comet_broadcast.asyn", { content: "-1" }, function (data, status) { var result = $("#divResult"); result.html(result.html() + "<br/>" + data); //服務器返回消息,再次立連接 wait(); }, "html" ); } //初始化連接 wait(); $("#btnSend").click(function () { send(); }); $("#content").keypress(function (event) { if (event.keyCode == 13) { send(); } }); }); 6.web.config IIS經典模式配置 <system.webServer> <modules runAllManagedModulesForAllRequests="true"> <remove name="FormsAuthentication" /> <remove name="ApplicationInsightsWebTracking" /> <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" /> </modules> <handlers> <add name="comet_broadcast" path="comet_broadcast.asyn" type="Handle.AsnyHandler" verb="POST,GET"/> </handlers> <validation validateIntegratedModeConfiguration="false" /> </system.webServer> 兼容舊版iis <system.web> <httpHandlers> <add name="comet_broadcast" path="comet_broadcast.asyn" type="Handle.AsnyHandler" verb="POST,GET"/> </httpHandlers> </system.web> 7.最後恭祝你身體健康,萬事如意。

asp.net web 通過IHttpAsyncHandler接口進行消息推送