Reactjs ASP.NET核心3.1信号器不';t偶尔返回数据以响应应用程序
我正在使用ASP.NET Core 3.1和React.js构建一个应用程序,但当我使用SignalRReactjs ASP.NET核心3.1信号器不';t偶尔返回数据以响应应用程序,reactjs,asp.net-core,signalr,Reactjs,Asp.net Core,Signalr,我正在使用ASP.NET Core 3.1和React.js构建一个应用程序,但当我使用SignalRonconnectedasync时,我会向呼叫者返回一个可用锦标赛的列表 问题是,它工作了大约5次,然后就停止了(只显示前端的微调器,我并没有在控制台中看到一系列锦标赛) 这是我的ASP.NET核心信号器代码: public class GameHub : Hub<IGameClient> { private readonly ITournamentsStore _tourn
onconnectedasync
时,我会向呼叫者返回一个可用锦标赛的列表
问题是,它工作了大约5次,然后就停止了(只显示前端的微调器,我并没有在控制台中看到一系列锦标赛)
这是我的ASP.NET核心信号器代码:
public class GameHub : Hub<IGameClient>
{
private readonly ITournamentsStore _tournamentsStore;
private readonly IMapper _mapper;
public GameHub(ITournamentsStore tournamentsStore, IMapper mapper)
{
_tournamentsStore = tournamentsStore;
_mapper = mapper;
}
public override async Task OnConnectedAsync()
{
await Groups.AddToGroupAsync(Context.ConnectionId, "Not playing");
var availableTournaments = _tournamentsStore.GetAvailableTournaments();
var availableTournamentsDto = _mapper.Map<List<TournamentDto>>(availableTournaments);
await Clients.Caller.ShowMainLobby(availableTournamentsDto);
await base.OnConnectedAsync();
}
}
公共类游戏中心:中心
{
私人只读ITournamentsStore\u tournamentsStore;
专用只读IMapper\u映射器;
公共游戏中心(ITournamentsStore tournamentsStore,IMapper mapper)
{
_tournamentsStore=tournamentsStore;
_映射器=映射器;
}
公共覆盖异步任务OnConnectedAsync()
{
wait Groups.AddToGroupAsync(Context.ConnectionId,“未播放”);
var availableTournaments=_tournamentsStore.GetAvailableTournaments();
var availableTournamentsDto=_mapper.Map(availableTournaments);
等待客户。来电者。ShowMain大厅(可用TurnamentsDTO);
等待base.OnConnectedAsync();
}
}
反应代码:
import React, { useEffect, useState } from "react";
import { HubConnectionBuilder } from "@microsoft/signalr";
import Spinner from "../common/Spinner";
import MainLobby from "../gameParts/MainLobby";
import { connect } from "react-redux";
import { Redirect, useHistory } from "react-router";
const GamePage = ({ account }) => {
const history = useHistory();
const [conn, setConn] = useState(null);
const [screen, setScreen] = useState("");
const [tournaments, setTournaments] = useState(null);
useEffect(() => {
const newConn = new HubConnectionBuilder()
.withUrl("/gameHub")
.withAutomaticReconnect()
.build();
setConn(newConn);
}, []);
useEffect(() => {
if (conn) {
conn
.start()
.then((result) => {
console.log("Connected");
conn.on("ShowMainLobby", (tournaments) => {
setTournaments(tournaments);
console.log(tournaments);
setScreen("ShowMainLobby");
});
})
.catch((ex) => console.log("connection Failed: ", ex));
}
}, [conn]);
function returnToHomeMenu() {
console.log(conn);
conn.stop();
history.push("/");
console.log("disconnected");
}
return !account.user.loggedIn ? (
<Redirect to="/login" />
) : screen === "" ? (
<>
<Spinner text="Establishing Real Time Connection" />
</>
) : screen === "ShowMainLobby" ? (
<>
<MainLobby
tournaments={tournaments}
returnToHomeMenu={returnToHomeMenu}
/>
</>
) : (
<></>
);
};
function mapStateToProps(state) {
return {
account: state.account,
};
}
export default connect(mapStateToProps)(GamePage);
import React,{useffect,useState}来自“React”;
从“@microsoft/signal”导入{HubConnectionBuilder};
从“./common/Spinner”导入微调器;
从“./gameParts/MainLobb”导入MainLobb;
从“react redux”导入{connect};
从“react router”导入{Redirect,useHistory};
const GamePage=({account})=>{
const history=useHistory();
const[conn,setConn]=useState(null);
常量[屏幕,设置屏幕]=使用状态(“”);
const[tournaments,setTournaments]=useState(null);
useffect(()=>{
const newConn=new HubConnectionBuilder()
.withUrl(“/gameHub”)
.withAutomaticReconnect()
.build();
setConn(纽康);
}, []);
useffect(()=>{
如果(康涅狄格州){
康涅狄格州
.start()
。然后((结果)=>{
控制台日志(“已连接”);
康涅狄格州(“ShowMainLobble”,(锦标赛)=>{
赛程锦标赛;
控制台日志(锦标赛);
设置屏幕(“ShowMain大厅”);
});
})
.catch((ex)=>console.log(“连接失败:”,ex));
}
}[康涅狄格州];
函数returnToHomeMenu(){
控制台日志(conn);
控制停止();
历史。推送(“/”);
控制台日志(“断开”);
}
return!account.user.loggedIn(
):屏幕==“”(
):screen==“ShowMain大厅”(
) : (
);
};
函数MapStateTops(状态){
返回{
账户:state.account,
};
}
导出默认连接(MapStateTops)(游戏页面);
感谢您的帮助 我不知道你所说的“它能工作大约5次”是什么意思,但如果问题是在连接开始时,你偶尔看不到“ShowMainLobble”的消息,那么可能是因为你在连接后调用connection.on(“ShowMainLobble”)。开始。所以有一场比赛,你应该在连接开始前加上。开始。这工作非常完美,多谢各位