.NET核心中间件未调用

时间:2018-06-30 07:04:56

标签: asp.net-core websocket .net-core middleware

你好,我有以下问题:

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

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

在服务器上,我创建了一个很小的中间件。Invoke方法没有被调用。

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

enter image description here

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 启动课程

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);

        }
    }

注意:我不会发布中间件使用的服务的代码,因为在这种情况下,它不相关。invoke不会被调用。

2 客户

客户端只是序列化POCO类Player并通过套接字发送它,然后等待服务器以Player列表进行响应。

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;
                    }

                }
            }


        }

PS 可能是服务器使用websockets,而在客户端上我使用socket类吗?只要目标地址和端口是好的..它只是字节。

1 个答案:

答案 0 :(得分:0)

Server.cs 中,Invoke 方法的参数类型为WebSocketManager

我们可以接受WebSocket连接,但不接受原始Socket
因此,在 Client.cs 中,我用{{1}替换了原始Socket }实施。