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