コード例 #1
0
        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();
                }
            }
        }
コード例 #2
0
        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();
            }
        }