protected async ValueTask HandlePackageInternal(IAppSession session, TPackageInfo package) { var packageHandler = PackageHandler; var errorHandler = ErrorHandler; try { if (packageHandler != null) { await packageHandler.Handle(session, package); } } catch (Exception e) { var toClose = await errorHandler(session, new PackageHandlingException <TPackageInfo>($"Session {session.SessionID} got an error when handle a package.", package, e)); if (toClose) { session.CloseAsync(CloseReason.ApplicationError).DoNotAwait(); } } }
public async Task TestCloseReason() { var hostConfigurator = new RegularHostConfigurator(); IAppSession session = null; using (var server = CreateSocketServerBuilder <TextPackageInfo, LinePipelineFilter>(hostConfigurator) .UseSessionHandler((s) => { session = s; return(new ValueTask()); }) .BuildAsServer()) { Assert.Equal("TestServer", server.Name); Assert.True(await server.StartAsync()); OutputHelper.WriteLine("Started."); CloseReason closeReason = CloseReason.Unknown; var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); await client.ConnectAsync(hostConfigurator.GetServerEndPoint()); OutputHelper.WriteLine("Connected."); await Task.Delay(1000); session.Closed += (s, e) => { closeReason = e.Reason; return(new ValueTask()); }; client.Shutdown(SocketShutdown.Both); client.Close(); await Task.Delay(1000); Assert.Equal(SessionState.Closed, session.State); Assert.Equal(CloseReason.RemoteClosing, closeReason); closeReason = CloseReason.Unknown; client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); await client.ConnectAsync(hostConfigurator.GetServerEndPoint()); OutputHelper.WriteLine("Connected."); await Task.Delay(1000); session.Closed += (s, e) => { closeReason = e.Reason; return(new ValueTask()); }; await session.CloseAsync(CloseReason.LocalClosing); await Task.Delay(1000); Assert.Equal(SessionState.Closed, session.State); Assert.Equal(CloseReason.LocalClosing, closeReason); await server.StopAsync(); } }