.NET Core 中间件未被调用

.NET Core Middleware is not invoked

您好,我遇到了以下问题:

我正在尝试通过 websockets 将对象从 Console Application 发送到 ASP NET Core Server

Console 应用程序上,我使用 NewtonSoft Json 序列化一个对象,然后通过 Socket 将其发送到 .NET Core 服务器。

我在服务器上创建了一个很小的 ​​middleware.The Invoke 方法,只是没有被调用。

我保留了 visual studio 的两个实例打开并且服务器端没有任何反应,直到我关闭客户端的连接并且服务器端弹出此错误 - 终端:

1 服务器

1.1 程序

    class Program
        {
            static void Main(string[] args)
            {
                BuildWebHost(args).Run();
            }
            public static IWebHost BuildWebHost(string[] args)=>

                WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseKestrel()
                .UseSockets()
                .UseUrls("http://localhost:8200")

                .Build();
        }

1.2 启动 class

public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {

            services.AddSingleton<WebSocketService>(x=>new WebSocketService());

        }
        public void Configure(IApplicationBuilder builder)
        {

            builder.UseWebSockets();
            builder.UseMiddleware<SocketMiddleware>();


        }
    }

1.3 中间件

class SocketMiddleware
    {
        WebSocketService handler;
        public SocketMiddleware(WebSocketService _handler,RequestDelegate del)
        {
            this.handler = _handler;
            this.next = del;
        }

        RequestDelegate next;

        public async Task Invoke(HttpContext context)
        {


            if (!context.WebSockets.IsWebSocketRequest)
            {
                await  this.next(context);
                return;
            }
            await this.handler.AddClientAsync(context.WebSockets);

        }
    }

注意:我不会 post 中间件使用的服务代码,因为它与此无关 case.The invoke 不会被调用。

2 客户端

客户端只是序列化一个 POCO class Player 并通过 socket.It 发送它,然后等待服务器以 [​​=22=] 的列表响应。

static async Task Main(string[] args)
        {
            Player updatePlayer = new Player(100);
            List<Player> players;
            Memory<byte> buffer = new byte[2000];
            ReadOnlyMemory<byte> toSend;
            ReadOnlyMemory<byte> actualReceived;
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8200);
            Random rand = new Random();

            await socket.ConnectAsync(iPEndPoint);
            using(NetworkStream stream =new NetworkStream(socket))
            {
                while (true)
                {
                    updatePlayer.Lat = rand.Next(10, 100);
                    updatePlayer.Lng = rand.Next(10, 100);

                    string data=JsonConvert.SerializeObject(updatePlayer);
                    toSend = Encoding.UTF8.GetBytes(data);
                    await stream.WriteAsync(toSend);

                    int received=await stream.ReadAsync(buffer);
                    actualReceived = buffer.Slice(0, received);
                    string msg = Encoding.UTF8.GetString(actualReceived.ToArray());
                    players = JsonConvert.DeserializeObject<List<Player>>(msg);
                    if (Console.ReadKey().Key == ConsoleKey.Escape)
                    {
                        break;
                    }

                }
            }


        }

P.S 难道是服务器使用 websockets 而在客户端上我使用 socket class?我想只要目标地址和端口没问题..它只是字节。

Server.cs 中,Invoke 方法 有一个类型为 WebSocketManager 的参数。

我们可以接受 WebSocket 连接但不能接受原始 Socket
因此在 Client.cs 我用 WebSocket 实现替换了原始 Socket