Я создал приложение Xamarin с чатом и API для хранения своих данных, каждые 3 минуты мобильное приложение отправляет запрос в API для сообщений чата.
Я решил использовать SignalR, как было предложено в комментариях:
-Добавлен в мой CongifureService, как показано:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<HostelContext>(opt =>
opt.UseSqlServer(Configuration.GetConnectionString("HostelContext")));
services.AddCors();
services.AddControllers();
services.AddAuthentication("BasicAuthentication")
.AddScheme<AuthenticationSchemeOptions, BasicAuthenticationHandler>("BasicAuthentication", null);
services.AddScoped<IUsersService, UsersService>();
services.AddScoped<IConversationsService, ConversationsService>();
services.AddScoped<IMessagesService, MessagesService>();
// Register the Swagger generator, defining 1 or more Swagger documents
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "HostelApi", Version = "v1" });
});
services.AddSignalR();
}
-Добавлена конечная точка для настройки, как показано:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<ChatHub>("/chatHub");
});
-Добавлен класс в мой Проект API в новой папке с именем Hub
- Это класс Hub:
//[Authorize]
public class ChatHub : Hub
{
public async Task SendMessage(Message message)
{
//await Clients.All.SendAsync("ReceiveMessage", message);
await Clients.All.SendAsync("ReceiveMessage" + message.ConversationId, message);
//await Clients.Users(destinationUserIdList).SendAsync("ReceiveMessage" + message.ConversationId, message);
}
}
В моем приложении Xamarin:
-Добавленная служба Hub:
-Это класс обслуживания концентратора:
class HubService : IHubService
{
public HubConnection HubConnection { get; }
public HubService()
{
HubConnection = new HubConnectionBuilder()
.WithUrl($"https://10.0.2.2:5001/chatHub")
.Build();
}
public async Task Connect()
{
await HubConnection.StartAsync().ConfigureAwait(false);
}
public async Task Disconnect()
{
await HubConnection.StopAsync().ConfigureAwait(false);
}
public async Task SendMessage(Message message)
{
await HubConnection.InvokeAsync("SendMessage", message).ConfigureAwait(false);
}
}
-Подключение к концентратору при запуске приложения после входа в систему:
public MainPage()
{
InitializeComponent();
MasterBehavior = MasterBehavior.Popover;
//should be home page
MenuPages.Add((int)MenuItemType.Home, (NavigationPage)Detail);
HubService.Connect().ConfigureAwait(true);
}
-Закрытие соединения при выходе из системы
- При отправке сообщения я вызываю метод SendMessage:
await HubService.SendMessage(message).ConfigureAwait(true);
OutGoingText = string.Empty;
Messages.Add(message);
Проблема теперь в том, когда я отправляю сообщение и получаю:
public async Task SendMessage(Message message)
{
await HubConnection.InvokeAsync("SendMessage", message).ConfigureAwait(false);
}
выдает следующее:
System.InvalidOperationException: 'The 'InvokeCoreAsync' method cannot be called if the connection is not active'
Уже пробовал с HubService.Connect (). Wait (), но приложение остается в oop
Может кто-нибудь помочь мне с этим ?? @ Ник Ковальский ...
С наилучшими пожеланиями