asp.net:javascript函数在从按钮单击事件调用时工作,而不是从redis的订阅事件调用时工作
我在两个场景中使用相同的js脚本调用。。。一个是从按钮点击事件调用的,它可以正常工作(更改标签文本),如下所示asp.net:javascript函数在从按钮单击事件调用时工作,而不是从redis的订阅事件调用时工作,javascript,c#,asp.net,redis,Javascript,C#,Asp.net,Redis,我在两个场景中使用相同的js脚本调用。。。一个是从按钮点击事件调用的,它可以正常工作(更改标签文本),如下所示 public void Test_OnClientClick(object sender, EventArgs e) { Console.WriteLine("test"); ClientScript.RegisterStartupScript(this.GetType(), "updateText", "updateTe
public void Test_OnClientClick(object sender, EventArgs e)
{
Console.WriteLine("test");
ClientScript.RegisterStartupScript(this.GetType(), "updateText", "updateText('test');", true);
}
当从redis订阅引发的事件调用它时,相同的调用不起作用
public void Page_Load(object sender, EventArgs e)
{
// Establish connection
redisConn = ConnectionMultiplexer.Connect(redisIP);
rbsub = redisConn.GetSubscriber();
rbsub.Subscribe(ServerRedisChannel).OnMessage(channelMessage => {
MessageHandler(channelMessage.Message.ToString());
});
}
public void MessageHandler(string cm)
{
try
{
//Test_OnClientClick(null, null);
ClientScript.RegisterStartupScript(this.GetType(), "updateText", "updateText('test');", true);
}
catch (Exception e)
{
var x = e;
}
}
我确认它通过断点到达MessageHandler中的ClientScript调用,但它从未到达js脚本中的调试器
完整代码如下:
Default.aspx
<%@ Page Title="Home Page" Async="true" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebForm._Default" %>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<script type="text/javascript">
function updateText(strData) {
debugger;
document.getElementById("<%=lblTest.ClientID%>").innerHTML = strData;
}
</script>
<div class="jumbotron">
<h1>redis test</h1>
<p><asp:Label ID="lblTest" runat="server" Text="redis output"></asp:Label></p>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Test_OnClientClick"/>
<p><a href="http://www.asp.net" class="btn btn-primary btn-lg">Learn more »</a></p>
</div>
</asp:Content>
因此,我假设问题归结为从按钮单击事件调用js脚本与从订阅(或异步)事件调用js脚本不同?对按钮单击的响应发生在中,而处理来自Redis订阅的异步消息很可能:
除非以某种方式同步这些线程(处理请求的线程和处理接收到的消息的线程),否则对
ClientScript.RegisterStartupScript
的调用将变为无效、错误的客户端或干脆失败。但是请注意,异步操作的性质可能需要与您不同的方法,而不是阻止线程等待消息。谢谢,是的,这就是我正在研究的路径…如何处理Redis订阅事件以允许其更新网页。。。有什么想法吗?我需要信号机或类似设备吗?请记住,该按钮仅用于测试,messagehandler应更新网页是的,使用WebSocket是选项之一,但通常的答案是“视情况而定”。这取决于用户需求/期望。这证实了我对继续在信号机路径上运行的怀疑,因此我将此标记为已回答,谢谢@tomasz
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using StackExchange.Redis;
namespace WebForm
{
public partial class _Default : Page
{
ConnectionMultiplexer redisConn;
ISubscriber rbsub;
public const string redisIP = "gptdevnj01:6379";
public const string ServerRedisChannel = "ac";
public const int redisDB = 7;
public void Page_Load(object sender, EventArgs e)
{
// Establish connection
redisConn = ConnectionMultiplexer.Connect(redisIP);
rbsub = redisConn.GetSubscriber();
rbsub.Subscribe(ServerRedisChannel).OnMessage(channelMessage => {
MessageHandler(channelMessage.Message.ToString());
});
}
public void MessageHandler(string cm)
{
try
{
//Test_OnClientClick(null, null);
ClientScript.RegisterStartupScript(this.GetType(), "updateText", "updateText('test');", true);
}
catch (Exception e)
{
var x = e;
}
}
public void Test_OnClientClick(object sender, EventArgs e)
{
Console.WriteLine("test");
ClientScript.RegisterStartupScript(this.GetType(), "updateText", "updateText('test');", true);
}
}
}