SignalR .Сетевой клиент с пакетом сообщений — метод AddMessagePackProtocol непризнан в IHubConnectionBuilder

#signalr #blazor-server-side #signalr.client #asp.net-core-signalr #signalrcore

#signalr #blazor-серверная часть #signalr.client #asp.net-core-signalr #signalrcore

Вопрос:

Новый пользователь, пытается изучить SignalR и сервер Blazor, надеясь, что кто-нибудь сможет помочь с этим запросом. Не удается заставить клиент SignalR .NET использовать протокол MessagePack на странице сервера Blazor.

.Установленные пакеты 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?).....
  

Кто-нибудь может помочь? Мне не хватает ссылки на сборку @using?

Страница сервера 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());
        }
    }
}

  

Ответ №1:

Наконец, получил это для компиляции, добавив:

 @using Microsoft.Extensions.DependencyInjection;
  

Надеюсь, это сэкономит время другим новым пользователям, которые сталкиваются с аналогичной проблемой.

Ответ №2:

Просто чтобы уточнить правильный ответ, уже данный @anon_dc3spp, следует отметить, что вы:

  1. Необходимо иметь Microsoft.AspNetCore.SignalR.Протоколы.Пакет Nuget MessagePack установлен как на клиенте, так и на сервере.

  2. Затем вы должны использовать его ссылку, показанную ниже на предполагаемой странице razor … или, возможно, добавить ее на страницу импорта:

    @с помощью Microsoft.Расширения.DependencyInjection