Asp.net core 未调用.NET核心中间件

Asp.net core 未调用.NET核心中间件,asp.net-core,websocket,.net-core,middleware,Asp.net Core,Websocket,.net Core,Middleware,您好,我有以下问题: 我正试图通过websockets将对象从控制台应用程序发送到ASP NET核心服务器 在控制台应用程序上,我用newtonsoftjson序列化一个对象,然后通过Socket将其发送到.NET核心服务器 在服务器上,我创建了一个小型中间件。Invoke方法不会被调用。我保持visual studio的两个实例处于打开状态,服务器端不会发生任何事情,直到我关闭客户端的连接,服务器端弹出此错误-终端: 1服务器 1.1计划 class Program

您好,我有以下问题:

我正试图通过
websockets
将对象从
控制台应用程序发送到
ASP NET核心服务器

控制台
应用程序上,我用
newtonsoftjson
序列化一个对象,然后通过
Socket
将其发送到.NET核心服务器

在服务器上,我创建了一个小型中间件。
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();
        }
注意:我不会发布中间件使用的服务的代码,因为它在本例中不相关。
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;
                    }

                }
            }


        }
static async Task Main(字符串[]args)
{
玩家更新层=新玩家(100);
列出参与者名单;
内存缓冲区=新字节[2000];
ReadOnlyMemory toSend;
实际接收的只读内存;
Socket Socket=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
IPEndPoint IPEndPoint=新的IPEndPoint(IPAddress.Parse(“127.0.0.1”),8200;
Random rand=新的Random();
等待socket.ConnectAsync(iPEndPoint);
使用(网络流=新网络流(套接字))
{
while(true)
{
updatePlayer.Lat=rand.Next(10100);
updatePlayer.Lng=rand.Next(10100);
string data=JsonConvert.SerializeObject(updatePlayer);
toSend=Encoding.UTF8.GetBytes(数据);
wait stream.WriteAsync(toSend);
int received=wait stream.ReadAsync(缓冲区);
actualReceived=buffer.Slice(0,已接收);
string msg=Encoding.UTF8.GetString(actualReceived.ToArray());
players=JsonConvert.DeserializeObject(msg);
if(Console.ReadKey().Key==ConsoleKey.Escape)
{
打破
}
}
}
}

p.S服务器使用
websockets
并且在客户端我使用
socket
类,这可能是个问题吗?我认为只要目标地址和端口正常..它只是字节。

server.cs
Invoke
方法有一个类型的参数
WebSocketManager

我们可以接受
WebSocket
连接,但不能接受原始的
Socket

因此,在Client.cs中,我用
WebSocket
实现替换了原始的
Socket

“我不会发布中间件使用的服务的代码,因为它与本例无关。”–我不确定我是否同意。你的中间件请求正在被中断,因此你如何与web socket请求交互确实很重要。也就是说,你确定你的客户端可以工作吗?你是否尝试过使用浏览器?日志中是否还有其他内容?我尝试过chrome提供的websocket客户端,它可以工作。Al因此,我尝试使用angular 2 js客户端,它仍然可以工作。
调用
方法被调用。为什么
控制台应用程序
不会调用它?我想可能是因为我发送了原始的
Tcp
,而.NET framework需要一个
HTTP GET
?您检查了吗?WebSocket不仅仅是裸Tcp sockets,它们是HTTP连接的升级,因此您不能仅仅打开一个这样的套接字就期望能够发送数据。是的,我知道,首先您发送一个HTTP请求,该请求将升级到websocket(原始tcp).但是你如何包装你的请求呢?我的意思是带一个原始套接字在C#中该如何处理?如果你想使用原始TCP套接字,你必须自己实现协议。否则,你可能应该使用WebSocket客户端库。
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);

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

                }
            }


        }