【问题标题】:Blazor - Send Message problem using SignalRBlazor - 使用 SignalR 发送消息问题
【发布时间】:2020-02-13 11:52:05
【问题描述】:

我创建了相当复杂的 Blazor 应用程序、调用 Web API、注入服务和使用 3rd 方库。但我第一次使用 SignalR。我的设置是:

  • ASP.NET Core Web API(做繁重的工作)
  • 前端 - Blazor 应用程序(服务器端 - 通过我在 blazor 项目中创建的服务类调用 Web api)

一切正常。我在我的 api 中创建了一个集线器并公开了端点。通过 blazer 客户端,我可以建立连接,并通过集线器将连接的额外客户端通知给所有客户端。

问题 尝试将消息从客户端发送/广播到服务器/集线器时,我收到一条非常奇怪的消息。单击发送按钮时,我收到“未捕获的语法错误:意外的数字”

点击错误上的链接,它给了我;

System.Runtime.CompilerServices.AsyncTaskMethodBuilder1+AsyncStateMachineBox1[System.Threading.Tasks.VoidTaskResult,MBOSS.Pages.Index+d__6]

代码

我的'Index.razror'组件很简单(如下):

@page "/index"
@using Microsoft.AspNetCore.SignalR.Client

<div class="container">
    <input type="text" id="message" class="form-control" bind="@Message" />
    <input type="button" id="sendMessage" value="Send" class="btn btn-primary" onclick="@SendMessage()" />
    <ul id="discussion">
        @foreach (var message in messages)
        {
            <li>@message</li>
        }
    </ul>
</div>

@code{
        HubConnection connection;
        string Message = "";
        IList<string> messages = new List<string>();

    protected override async Task OnInitializedAsync()
    {
        connection = new HubConnectionBuilder().WithUrl("http://localhost:63572/livedata").Build();
        connection.On<string, string>("broadcastMessage", this.OnBroadcastMessage);
        await connection.StartAsync();
    }

    Task OnBroadcastMessage(string name, string message)
    {
        if (!string.IsNullOrEmpty(message))
        {
            messages.Add(name + " : " + message);
            StateHasChanged();
        }
        return Task.CompletedTask;
    }

    async Task SendMessage()
    {
        await connection.InvokeAsync("Send", "Blazor Client", Message);
        Message = "";
    }
}

我的 hub 类也很简单;

using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

namespace SignalRTest
{
    public class LiveData : Hub
    {
        public override Task OnConnectedAsync()
        {
            Clients.All.SendAsync("broadcastMessage", "system", $"{Context.ConnectionId} joined the conversation");
            return base.OnConnectedAsync();
        }
        public void Send(string name, string message)
        {
            Clients.All.SendAsync("broadcastMessage", name, message);
        }

        public override Task OnDisconnectedAsync(System.Exception exception)
        {
            Clients.All.SendAsync("broadcastMessage", "system", $"{Context.ConnectionId} left the conversation");
            return base.OnDisconnectedAsync(exception);
        }
    }
}

有人可以建议如何解决这个问题,以便我可以开始将 SignalR 与 Blazor 一起使用。

非常感谢

【问题讨论】:

    标签: c# signalr asp.net-core-webapi blazor blazor-server-side


    【解决方案1】:

    对不起各位,我的错!

    非常愚蠢的(语法)问题。大多数情况下,我使用 3rd 方 blazor 库(如 Radzen、DevExpress 等)来生成 UI。对于这个 blazor signalR 客户端应用程序,我使用纯 html 标记。问题出在“绑定”和“点击”属性上。这些应该以@符号开头。

    所以,输入文本应该是;

    <input type="text" id="message" class="form-control" @bind="Message" />
    

    而不是

    <input type="text" id="message" class="form-control" bind="@Message" />
    

    按钮应该是

        <input type="button" id="sendMessage" value="Send" class="btn btn-primary" @onclick="SendMessage" />
    

    而不是

    <input type="button" id="sendMessage" value="Send" class="btn btn-primary" onclick="@SendMessage()" />
    

    【讨论】:

    • @Maxter @bind
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多