SignalR Core - StatusCode: 404, ReasonPhrase: «Not Found», версия: 1.1 - PullRequest
2 голосов
/ 28 мая 2019

У меня есть два проекта.

Во-первых, WebApi, который содержит концентратор для использования SignalR:

public class NotificationsHub : Hub
{
    public async Task GetUpdateForServer(string call)
    {
        await this.Clients.Caller.SendAsync("ReciveServerUpdate", call);
    }
}

Я настроил этот концентратор в Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        // ofc there is other stuff here

        services.AddHttpContextAccessor();
        services.AddSignalR();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseSignalR(routes => routes.MapHub<NotificationsHub>("/Notifications"));
    }

Я верю, что я буду делать уведомления, как это в TaskController.cs:

    [HttpPost]
    public async Task<IActionResult> PostTask([FromBody] TaskManager.Models.Task task)
    {
        if (!this.ModelState.IsValid)
        {
            return this.BadRequest(this.ModelState);
        }

        this.taskService.Add(task);

        //here, after POST i want to notify whole clients
        await this.notificationsHub.Clients.All.SendAsync("NewTask", "New Task in database!");

        return this.Ok(task);
    }

Проблема начинается здесь.

У меня есть WPF приложение, которое содержит HubService:

public class HubService
{
    public static HubService Instance { get; } = new HubService();

    public ObservableCollection<string> Notifications { get; set; }

    public async void Initialized()
    {
        this.Notifications = new ObservableCollection<string>();

        var queryStrings = new Dictionary<string, string>
        {
            { "group", "allUpdates" }
        };

        var hubConnection = new HubConnection("https://localhost:44365/Notifications", queryStrings);
        var hubProxy = hubConnection.CreateHubProxy("NotificationsHub");

        hubProxy.On<string>("ReciveServerUpdate", call =>
        {
            //todo
        });

        await hubConnection.Start();
    }
}

И я инициализирую его в своем конструкторе MainViewModel:

    public MainWindowViewModel()
    {
        HubService.Instance.Initialized();
    }

Проблема начинается в await hubConnection.Start();.Из этой строки я получаю сообщение об ошибке:

"StatusCode: 404, ReasonPhrase:« Not Found », версия: 1.1, Content: System.Net.Http.StreamContent, заголовки: X-SourceFiles:? = UTF-8 B QzpcVXNlcnNcQWRtaW5cc291cmNlXHJlcG9zXFRhc2tNYW5hZ2VyXFRhc2tNYW5hZ2VyLXdlYmFwaVxOb3RpZmljYXRpb25zXHNpZ25hbHJcbmVnb3RpYXRl = Дата:? Вт, 28 мая 2019 16:25:13 GMT Сервер: Kestrel X-Powered-By: ASP.NET Content-Length: 0

1032

У меня вопрос, что я делаю не так и как подключиться к Hub в моем WebApi проекте?

EDIT

Hub, кажется, работает. Я набрал в своем браузере: https://localhost:44365/notifications и я получил сообщение:

Требуется идентификатор подключения

EDIT2

WPF проект .NET Framework 4.7.2 и WebApi равно Core 2.1.

1 Ответ

0 голосов
/ 28 мая 2019

я нашел решение.

Ища его в интернете, я обнаружил, что ссылка на Microsoft.AspNet.SignalR не будет работать с SignalR сервером на базе Core.

Мне нужно было изменитьнекоторые вещи в моем WPF проекте, который .NET Framework 4.7.2.Сначала удалите ссылку на AspNet.SignalR и измените ее на Core.Чтобы получить это, просто установите этот nugets в свой .Net Framework proj:

enter image description here

Затем этот сервис компилируется без ошибок (IDK, если он еще работает, ноя получаю счетчик подключений до 1 на моем WebApi с Core SignalR):

using System.Collections.ObjectModel;
using Microsoft.AspNetCore.SignalR.Client;

public class HubService
{
    public static HubService Instance { get; } = new HubService();

    public ObservableCollection<string> Notifications { get; set; }

    public async void Initialized()
    {
        this.Notifications = new ObservableCollection<string>();

        var hubConnection = new HubConnectionBuilder()
            .WithUrl(UrlBuilder.BuildEndpoint("Notifications"))
            .Build();

        hubConnection.On<string>("ReciveServerUpdate", update =>
        {
            //todo, adding updates tolist for example
        });

        await hubConnection.StartAsync();
    }
}

Теперь мой WPF компилируется без исключения.Я получаю уведомления от сервера

...