.NET Core Middleware не вызывается - PullRequest
0 голосов
/ 30 июня 2018

Здравствуйте, у меня есть следующая проблема:

Я пытаюсь отправить объект из 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 голосов
/ 02 июля 2018

В Server.cs метод Invoke имеет параметр типа WebSocketManager.

Мы можем принять WebSocket соединение, но не raw Socket.
Поэтому в Client.cs я заменил raw Socket реализацией WebSocket.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...