65.9K
CodeProject 正在变化。 阅读更多。
Home

DWR 类似 ASP.NET 中的 .NET Comet Ajax

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (3投票s)

2010年4月15日

CPOL

2分钟阅读

viewsIcon

41588

downloadIcon

594

在 ASP.NET 中轻松实现类似 DWR 的 Comet

PokeIn Comet Ajax for .NET

设想一下,一个库,你可以轻松地从客户端访问服务器端对象,反之亦然? 我将解释如何使用 PokeIn 轻松实现这一点。

首先,PokeIn 是一个免费库,你可以从 这里 下载它!

让我们逐步创建一个简单的应用程序。 我将提到 "Bind" 方法来找到我们的方法。

public static bool Bind(string listenUrl, string sendUrl,
    System.Web.UI.Page page, DefineClassObjects classDefs, out string ClientId);

"Bind" 在客户端提供服务器端对象的定义。 此外,通过此方法,服务器端知道存在客户端连接请求。"Bind" 为客户端定义一个唯一的 ClientId,创建指定的用户类,并在客户端定义它们。 简而言之,如果你将 "Bind" 方法添加到 CometAjax 所需的页面,它将组织你的页面与服务器端通信,例如:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" 
   Inherits="MyPage._Default" %>
<html>
<head>
    <%
        string ClientId = ""; //<- it stands to use ClientId on Default.Aspx page, 
           i.e., you may define server side events for client side objects via PokeIn ;)
        if (!PokeIn.Comet.CometWorker.Bind("Listen.aspx", "Send.aspx",
            this, new PokeIn.Comet.DefineClassObjects(MyPage._Default.classDefiner),
            out ClientId))
        {
            Response.Write("Application Stopped!");
            return;
        }
    %>
</head>

"Bind" 方法定义 PokeIn JavaScript 方法和给定的服务器端对象。 至于 "MyPage._Default.classDefiner" 呢? 它将为每个客户端创建你定义的那些对象。 因此,每个对象都知道它所属的客户端。

以下代码由 Visual Studio 自动生成,除了 "classDefiner" 方法。

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    public static void classDefiner(string clientId, ref Dictionary<string> classList)
    {
        // HERE we define our Dummy class per each client
        classList.Add("Dummy", new Dummy(clientId)); 
    }
}

我们定义了与 clientId 关联的 "Dummy" 类。 让我展示 Dummy 类。

public class Dummy
{
    string ClientId;
    public Dummy(string clientId)
    {
        ClientId = clientId;
    }
    public void Calculate(int x, int y)
    {
        PokeIn.Comet.CometWorker.SendToClient(ClientId,
            "ResultCalculated(" + (x + y).ToString() + ");"); 
    }
}

如果你的类需要关联的客户端信息,你可以像我在上面的示例中显示的那样保留它。 你将使用带有这个唯一客户端 ID 的 static PokeIn 方法,例如,在上面的示例中,我们调用了 "SendToClient" 方法。 它在 clientId 的所有者上运行 JavaScript 代码。

这是 Dummy 类的客户端用法

Dummy.Calculate(3, 4);

这不是很简单吗? 因此,我们从服务器端方法发送了 "ResultCalculated",用于 "Dummy.Calculate" 调用。 因此,客户端需要这个方法的定义。 如你所知,我们称之为 "ResultCalculated",但不要忘记你可以发送任何你想要的东西。

"ResultCalculated" 的定义是

function ResultCalculated( result )
{
    alert( result );
}

在我们启动应用程序之前,还有 2 个定义需要完成。"Bind" 方法中的 "Listen.aspx" 和 "Send.aspx" 参数? 名称无关紧要。 只需要添加以下行来定义两种不同的方式处理程序,例如,Listen.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Listen.aspx.cs" 
    Inherits="MyPage.Listen" %>
<% 
    //Check UserLogin etc
    PokeIn.Comet.CometWorker.Listen(this);
%>

Send.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Send.aspx.cs" 
    Inherits="MyPage.Send" %>
<% 
    //Check UserLogin etc
    PokeIn.Comet.CometWorker.Send(this);
%>

PokeIn 使用 "Listen" 定义进行服务器推送操作,使用 "Send" 定义进行客户端推送操作。

结束!

我们的基于 Comet Ajax 的 Web 应用程序已经完成! 它比 DWR 更容易!

Using the Code

下载附加到本文的代码以查看它的工作方式。 你应该从 这里 下载库!

PokeInSample

  1. 打开项目。
  2. 右键单击项目引用。
  3. 添加你下载的 "PokeIn.dll"。

运行!

历史

  • 2010 年 4 月 15 日:初始发布
© . All rights reserved.