.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
。
您好,我遇到了以下问题:
我正在尝试通过 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
。