在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();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM