asp. net: javascript функция работает при вызове из события нажатия кнопки, а не при вызове из события подписки из redis - PullRequest
0 голосов
/ 02 марта 2020

Я использую один и тот же js вызов сценария в обоих сценариях ios ... один, который вызывается из события button_click, и он работает правильно (изменяет текст метки), как показано ниже ...

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;
        }
    }

Я подтверждаю, что он достигает вызова ClientScript в MessageHandler с точкой останова, но он никогда не достигает отладчика в сценарии 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>

По умолчанию .aspx.cs

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);
        }


    }
}

Итак, я полагаю, что вопрос сводится к вызову js сценария из события button_click, отличного от того, когда он вызывается из подписки (или asyn c) событие?

1 Ответ

0 голосов
/ 02 марта 2020

Ответ на нажатие кнопки происходит в течение ASP. NET Жизненный цикл страницы , тогда как обработка асинхронного сообщения из подписки Redis, скорее всего, произойдет:

  1. полностью вне этого жизненного цикла и
  2. в совершенно другом потоке.

Если вы как-то не синхронизируете эти потоки (один, который обрабатывает запрос, и другой, который обрабатывает полученные сообщения) - ваш вызов ClientScript.RegisterStartupScript приведет к аннулированию go, к неверному клиенту или просто к ошибке. Однако обратите внимание, что характер асинхронных операций может потребовать от вас другого подхода, а не блокировать поток для ожидания сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...