Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
asp.net:javascript函数在从按钮单击事件调用时工作,而不是从redis的订阅事件调用时工作_Javascript_C#_Asp.net_Redis - Fatal编程技术网

asp.net:javascript函数在从按钮单击事件调用时工作,而不是从redis的订阅事件调用时工作

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

我在两个场景中使用相同的js脚本调用。。。一个是从按钮点击事件调用的,它可以正常工作(更改标签文本),如下所示

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 &raquo;</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);
            }
    
    
        }
    }