微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在ASP.NET Core Web API中使用SuperSocket.WebSocket.Server

使用SuperSocket做WebSocket服务器开发需要引用包SuperSocket.WebSocket.Server,本文简称SuperWebScoket。

本文环境为.Net5 + ASP.Net Core Web API + SuperSocket.WebSocket.Server 2.0.0-beta.10,介绍了如何在在.NetCore WebAPI中使用SuperWebScoket的方法,以及如何启动WebSocket。

本文假设读者具有.NetCore Web API及SuperWebScoket的使用经验。

1、创建自定义WebScoket服务

WebScoket服务主要对WebScoket的配置进行设置,使用了内存配置代替传统的配置文件,通过在WebAPI项目中设置WebScoket端口,实现了端口的动态配置。

此外,参考《在WPF中集成SuperSocket 2.0》,WebScoket服务也在关闭IHost时执行了dispose方法。不过,作为服务端程序,WebScoket服务一般不会关闭,直到所在的进程退出

public interface IWebSocketServerService
{
    Task Startup();
    Task Shutdown();
}
public class WebSocketServerService : IWebSocketServerService
{
    private IHost _host;
    private readonly ILogger<WebSocketServerService> _logger;
    private readonly int _port;

    public WebSocketServerService(ILogger<WebSocketServerService> logger, IConfiguration configuration)
    {
        _logger = logger;

        var port = configuration["WebSocketServer:Port"];
        if (!int.TryParse(port, out _port))
        {
            _port = 6666;
            _logger.LogWarning($"读取WebSocketServerPort失败,认监听端口{_port}.");
        }
    }

    public async Task Startup()
    {
        try
        {
            _host = WebSocketHostBuilder.Create()
                //注册WebSocket消息处理器
                .UseWebSocketMessageHandler(async (session, package) =>
                {
                    Console.WriteLine($@"{DateTime.Now:yyyy-MM-dd HH:mm:ss fff} Receive message: {package.Message}.");

                    //Send message back
                    var message =
                        $@"{DateTime.Now:yyyy-MM-dd HH:mm:ss fff} Hello from WebSocket Server: {package.Message}.";
                    await session.SendAsync(message);
                })
                .ConfigureAppConfiguration((hostCtx, configApp) =>
                {
                    configApp.AddInMemoryCollection(new Dictionary<string, string>
                    {
                        {"serverOptions:name", "NwMesServer"},
                        {"serverOptions:listeners:0:ip", "Any"},
                        {"serverOptions:listeners:0:port", $"{_port}"}
                    });
                })
                .ConfigureLogging((hostCtx, loggingBuilder) =>
                {
                    //添加控制台输出
                    loggingBuilder.AddConsole();
                })
                .Build();
            await _host.RunAsync();
        }
        catch (Exception e)
        {
            _logger.LogError($"启动WebSocketServer失败:{e.GetMessageWithInnerException()}.");
        }
    }

    public async Task Shutdown()
    {
        try
        {
            await _host.StopAsync();
        }
        catch (Exception e)
        {
            _logger.LogError($"关闭WebSocketServer失败:{e.Message}.");
        }
        finally
        {
            _host.dispose();
        }
    }
}

2、注册WebScoket服务

在Startup.cs的ConfigureServices方法中注入即可。

public void ConfigureServices(IServiceCollection services)
{
    //注入服务
    services.AddScoped<IMd5Service, Md5Service>();
    services.AddSingleton<IWebSocketServerService, WebSocketServerService>();
}

3、启动WebSocket服务

在Startup.cs的Configure方法中启动WebScoket服务。

public async void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...

    app.UseEndpoints(endpoints => { endpoints.MapControllers(); });

    //启动WebSocket服务
    var webSocketServerService = app.applicationservices.GetService<IWebSocketServerService>();
    await webSocketServerService.Startup();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐