具有MessagePack的SignalR .Net客户端-IHubConnectionBuilder无法识别AddMessagePackProtocol方法

问题描述

新用户,试图学习SignalR和Blazor Server,希望有人可以对此查询提供帮助。努力让SignalR .NET客户端在Blazor服务器页面中使用 MessagePack 协议。

.csproj软件包已安装

<ItemGroup>
    <packagereference Include="Autofac" Version="5.2.0" />
    <packagereference Include="Autofac.Extensions.DependencyInjection" Version="6.0.0" />
    <!-- <packagereference Include="MessagePack" Version="1.9.3" /> -->
    <packagereference Include="Microsoft.AspNetCore.SignalR" Version="1.1.0" />
    <packagereference Include="Microsoft.AspNetCore.SignalR.Client" Version="3.1.7" />
    <packagereference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="3.1.7" />
</ItemGroup>

最初,我已经安装了3.1.8的SingalR Client和MessagePack软件包。但是,我也尝试降级到3.1.7,但问题仍然存在。

这段代码

    hubConnection = new HubConnectionBuilder()
                .WithUrl(hubUrl)
                .AddMessagePackProtocol()
                .Build();

导致构建错误

error CS1061: 'IHubConnectionBuilder' does not contain a deFinition for 'AddMessagePackProtocol' and no accessible extension method 'AddMessagePackProtocol' accepting a first argument of type 'IHubConnectionBuilder' Could be found (are you missing a using directive or an assembly reference?).....

有人可以帮忙吗?我是否缺少使用@引用的程序集?

Blazor服务器页面

@page "/"

@using System.Threading;
@using System.Collections.Generic;
@using Microsoft.AspNetCore.SignalR.Client;
@using WebApp.Data;

@inject NavigationManager NavigationManager


<h1>Blazor Server App</h1>

<div>Latest message is => @_latestMessage</div>

<div id="scrollBox">
    @foreach (var item in _messages)
    {
        <div>
            <div>@item</div>
        </div>
    }
    <hr />
</div>


@code {
    private HubConnection hubConnection;
    private string _latestMessage = "";
    private List<string> _messages = new List<string>();
    public bool IsConnected => hubConnection.State == HubConnectionState.Connected;

    protected override async Task OnInitializedAsync()
    {
        var hubUrl = NavigationManager.BaseUri.TrimEnd('/') + "/motionhub";
        // Uri uri = NavigationManager.ToAbsoluteUri("/motionhub");

        try
        {
            hubConnection = new HubConnectionBuilder()
                .WithUrl(hubUrl)
                .AddMessagePackProtocol()
                .Build();

            hubConnection.On<string>("SendMotionDetection",ReceiveMessage);

            await hubConnection.StartAsync();

            Console.WriteLine("Index Razor Page initialised,listening on signalR hub url => " + hubUrl.ToString());
            Console.WriteLine("Hub Connected => " + IsConnected);
        }
        catch (Exception e)
        {
            Console.WriteLine("Encountered exception => " + e);
        }
    }

    private void ReceiveMessage(string message)
    {
        try
        {
            Console.WriteLine("hey! I received a message");
            _latestMessage = message;
            _messages.Add(_latestMessage);

            StateHasChanged();
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine("An exception was encountered => " + ex.ToString());
        }
    }
}

解决方法

最后,通过添加以下内容进行编译:

@using Microsoft.Extensions.DependencyInjection;

希望这可以为遇到类似问题的其他新用户节省一些时间。