Как подключиться к концентратору SignalR из клиента C # - PullRequest
0 голосов
/ 29 марта 2019

У меня есть Console Application, и я пытаюсь подписаться на SignalR хаб. Глядя на все примеры в интернете, я вижу, что для этого все используют HubConnection. Проблема в том, что я думаю, что все они устарели, поскольку constructor в их случае занимает url, а в документации - IConnectionFactory и ILoggerFactory.

Сервер

public class Startup {

        public void ConfigureServices(IServiceCollection services) {
            services.AddCors(o =>
            o.AddPolicy("CorsPolicty", b => b.WithOrigins("http://localhost:4200").AllowAnyHeader().AllowAnyMethod().AllowCredentials());
            services.AddSignalR();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
            app.UseDeveloperExceptionPage();
            app.UseSignalR(r => r.MapHub<MyHub>("/myhub"));
        }
    }


public class MyHub:Hub {
        public async Task SendMessage(string user,string message) {

            await this.Clients.All.SendAsync("ReceiveMessage", user, message);

        }
    }

Клиент

Таким образом, HubConnection не похож на примеры MSDN, также я рассмотрел класс HubConnectionBuilder, в этом случае во всех примерах имеет расширение WithUrl, тогда как в действительности он имеет IServiceCollection, где вы Можно добавить услуги.

class ConcreteContext : ConnectionContext {
        public override string ConnectionId { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }

        public override IFeatureCollection Features => throw new NotImplementedException();

        public override IDictionary<object, object> Items { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
        public override IDuplexPipe Transport { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
    }
    class Factory : IConnectionFactory {
        public Task<ConnectionContext> ConnectAsync(TransferFormat transferFormat, CancellationToken cancellationToken = default(CancellationToken)) {
            var context = new ConcreteContext();
            return Task.FromResult(context as ConnectionContext);
        }

        public Task DisposeAsync(ConnectionContext connection) {
            throw new NotImplementedException();
        }
    }
    class Program {
        static void Main(string[] args) {
            //try 1
            var builder = new HubConnectionBuilder().Build(); //no withUrl extensions
            //try 2
            var factory = new Factory();
            var hub = new HubConnection(factory,); //needs IConnectionFactory and IHubProtocol and ILoggerFactory

        }

Я не могу поверить, что мне нужно реализовать все это, чтобы начать соединение. Как я могу подключиться к концентратору? Я мог бы вернуться к raw websockets, если бы мне пришлось написать так много только для одной вещи.

1 Ответ

0 голосов
/ 29 марта 2019

Этот SO вопрос, похоже, решен, но содержит ссылки и ссылки для подключения от клиента к концентратору для SignalR Core.

Код клиента выглядит намного проще, чем вы показываете. Я бы проверил это и ссылки, если это необходимо.

...