У меня есть 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
, если бы мне пришлось написать так много только для одной вещи.