我正在try 在我的WASM应用程序中建立WebSocket连接. 我遵循了MSDN教程,并在我的Program.cs中启用了WebSockets:

app.UseWebSockets();

在那之后,我添加了一个新的控制器,如下所示:

[AllowAnonymous]
[ApiController]
[Route("[controller]")]
internal class ShellyPlusDataController : ControllerBase
{
    [HttpGet]
    [Route("[controller]/OnDataReceived")]
    public async Task OnDataReceived()
    {
        if (HttpContext.WebSockets.IsWebSocketRequest)
        {
            using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();

            var buffer = new byte[1024 * 4];
            WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);

            while (!result.CloseStatus.HasValue)
            {
                string raw = Encoding.UTF8.GetString(buffer, 0, result.Count);
                result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            }

            await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
        }
        else
        {
            HttpContext.Response.StatusCode = StatusCodes.Status400BadRequest;
        }
    }
}

PostMan打开与‘wss://localhost:7220/ShellyPlusData/OnDataReceived’的连接不起作用.显示的错误为:Error: Unexpected server response: 200

我在OnDataReceived()的开头设置了一个断点;它从未命中. 我还try 将URL更改为ws://或省略方法名称,但没有成功.

微软的教程也在Program.cs中建议这样做:

app.Use(async (context, next) =>
{
    if (context.Request.Path == "/ws")
    {
        if (context.WebSockets.IsWebSocketRequest)
        {
            using var webSocket = await context.WebSockets.AcceptWebSocketAsync();
            await Echo(webSocket);
        }
        else
        {
            context.Response.StatusCode = StatusCodes.Status400BadRequest;
        }
    }
    else
    {
        await next(context);
    }
});

也不管用. 有什么建议吗?

推荐答案

所以我不得不自己想办法.有两件事需要解决:

  1. 本地WebSocket连接不起作用.我不知道需要配置什么才能在本地调试模式下启用WebSocket,但当我将应用程序部署到远程IIS服务器时,我可以建立连接.
  2. 我的控制器类是内部的,在使用WS连接时,路由的工作方式似乎有所不同.以下是工人阶级:

公共类ShellyPlusDataConnectionController:ControllerBase {

    [HttpGet("/ShellyPlusDataConnection/OnDataReceived")]
    public async Task OnDataReceived()
    {
        if (HttpContext.WebSockets.IsWebSocketRequest)
        {
            using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();

            var buffer = new byte[1024 * 4];
            WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);

            while (!result.CloseStatus.HasValue)
            {
                string raw = Encoding.UTF8.GetString(buffer, 0, result.Count);


                result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            }

            await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
        }
        else
        {
            HttpContext.Response.StatusCode = StatusCodes.Status400BadRequest;
        }
    }
}

Csharp相关问答推荐

将实例绑定方法传递到列表foreach

List T.AddRange在传递ConcurrentDictionary作为参数时引发ArgumentExcellent

如何在Visual Studio中为C# spread操作符设置格式规则?

为什么我不能更改尚未设置的模拟对象属性的值?

使用客户端密钥为Fabric Rest API生成令牌

System.Text.Json数据化的C#类映射

实现List T,为什么LINQ之后它不会返回MyList?<>(无法强制转换WhereListIterator `1类型的对象)'

Unity中的刚体2D运动

WPF DataGrid中的三维数据

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

使用预定义对象减少Task.Run/Factory.StartNew中的关闭开销

C#中浮点数的System.Text.Json序列化问题

确定System.Text.Json序列化中是否无法识别Type

DbContext-传递自定义配置选项

带有列表参数的表达式树

如何在microsoft.clearscript.v8的jsondata中使用Linq

如何让游戏对象在切换场景时被销毁,但在开始新游戏时重新锁定

C#使用相同内存的多个数组

如何在.NET MAUI上在iOS和Mac之间共享代码?(no条件编译和无代码重复)

使用C#代码和SQL SERVER中的相同证书签名会产生不同的结果