ASP.NET:如何在订阅的事件处理程序中更新前端

Posted

技术标签:

【中文标题】ASP.NET:如何在订阅的事件处理程序中更新前端【英文标题】:ASP.NET: How to update frontend within a subscribed event handler 【发布时间】:2011-12-06 06:02:19 【问题描述】:

情况

我有一个 ASP.NET Webform,其中包含有关用户 Microsoft Lync 2010 会话的一些状态信息。在 Page_Load 事件中,我注册了一个事件处理程序,用于侦听 Lync 会话状态更改事件。

一旦事件触发,事件处理程序会做出正确反应并完成其工作:它会更改特定标签的相应文本。问题是,这些更改在前端网页中不可见。

代码

这是一个全局 Lync 客户端实例,在页面中定义。

private LyncClient _lyncClient;

这里我在 Page_Load 事件中注册 LyncClient。

protected void Page_Load(object sender, EventArgs e)

    RegisterLyncClient();

我将 LyncClient 实例分配给全局 _lyncClient。之后我注册了我的事件监听器。

private void RegisterLyncClient()

    _lyncClient = LyncClient.GetClient();
    _lyncClient.StateChanged += HandleStateChanged;

此函数在 Lync 客户端更改其状态时正确触发。它在调试模式下可见。

private void HandleStateChanged(object sender, ClientStateChangedEventArgs e)

     SetLyncStatus(e.NewState);

标签文本已正确更改(在调试模式下)。但是这些变化在前端是不可见的。

private void SetLyncStatus(ClientState lyncState)

    lblLyncStatus.Text = lyncState.ToString();

假设

如果我使用按钮手动更改状态,或者如果我使用计时器每秒检查和调整状态,则更改是可见的。所以我假设在 HandleStateChanged 事件处理程序中所做的更改是不可见的,因为调用 SetLyncStatus 函数后没有回发。

问题

是否可以从事件处理程序强制回发,而不是从用户操作(例如用户单击按钮)中触发?如果可以调用标签或定义部分的部分刷新,那将是完美的。

非常感谢任何建议。谢谢!

【问题讨论】:

您的具体情况是什么?可能有更合适的方法来实施您的解决方案,而不是在您的 Web 服务器上安装 Lync 客户端 是的,这是我在本地开发过程中没有意识到的另一个问题。确保 Lync 事件发生在服务器而不是客户端。好的,谢谢这是一个非常好的建议...... 【参考方案1】:

在您尝试实施任何解决方案之前,请尝试了解什么在客户端运行什么在服务器上运行。也许您有桌面开发背景,因此您还需要了解 Web 的无状态性质。服务器端发生的任何更改都不会反映在客户端,反之亦然。一旦服务器响应了请求,它就不会自动将状态更新传达给客户端。因此,在您的情况下,均匀驱动的方法将不起作用。您需要从客户端执行 ping 操作以确定状态更改。可以使用具有预定义周期性间隔的 AJAX 来完成此 ping。

【讨论】:

感谢您的快速回答!这意味着我必须使用计时器或类似的东西定期更新网站。 是的,从客户端使用 javascript + AJAX 您需要反复 ping 到服务器以获取更新状态。决定优化 ping 内部(不要太长也不要太短)比如服务器没有超载

以上是关于ASP.NET:如何在订阅的事件处理程序中更新前端的主要内容,如果未能解决你的问题,请参考以下文章

无法从 ASP.NET Core 6.0 API NServiceBus 端点订阅事件

ASP.NET Core Web API下事件驱动型架构的实现:一个简单的实现

ASP.NET MVC 主视图引用的js(jquery)在分部视图中无效,如何解决?

使用单个事件处理程序 asp.net 从网格中处理多个删除事件

如何在 ASP.NET Core Web API 中使用 MassTransit 事件总线?

异步更新 ASP.NET 面板