Skip to content

Bits of .NET

Daily micro-tips for C#, SQL, performance, and scalable backend engineering.

  • Asp.Net Core
  • C#
  • SQL
  • JavaScript
  • CSS
  • About
  • ErcanOPAK.com
  • No Access
  • Privacy Policy
Ajax

Ajax: Use WebSockets in .NET Core

- 11.07.26 - ErcanOPAK

πŸ”Œ WebSockets in .NET Core

Real-time is essential. WebSockets in .NET Core enable bidirectional communication.

πŸ“ WebSocket Setup

// Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.UseWebSockets();

app.Map("/ws", async context =>
{
    if (context.WebSockets.IsWebSocketRequest)
    {
        using var webSocket = await context.WebSockets.AcceptWebSocketAsync();
        await HandleWebSocket(webSocket);
    }
    else
    {
        context.Response.StatusCode = 400;
    }
});

async Task HandleWebSocket(WebSocket webSocket)
{
    var buffer = new byte[1024 * 4];
    var result = await webSocket.ReceiveAsync(buffer, CancellationToken.None);
    
    while (!result.CloseStatus.HasValue)
    {
        var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
        Console.WriteLine($"Received: {message}");
        
        var response = $"Echo: {message}";
        var responseBytes = Encoding.UTF8.GetBytes(response);
        await webSocket.SendAsync(
            responseBytes,
            result.MessageType,
            result.EndOfMessage,
            CancellationToken.None);
        
        result = await webSocket.ReceiveAsync(buffer, CancellationToken.None);
    }
    
    await webSocket.CloseAsync(
        result.CloseStatus.Value,
        result.CloseStatusDescription,
        CancellationToken.None);
}

app.Run();

🎯 Advanced WebSockets

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

// WebSocket manager
public class WebSocketManager
{
    private static readonly List _sockets = new();
    
    public static async Task Add(WebSocket socket)
    {
        _sockets.Add(socket);
    }
    
    public static async Task Broadcast(string message)
    {
        var bytes = Encoding.UTF8.GetBytes(message);
        foreach (var socket in _sockets)
        {
            if (socket.State == WebSocketState.Open)
            {
                await socket.SendAsync(
                    bytes,
                    WebSocketMessageType.Text,
                    true,
                    CancellationToken.None);
            }
        }
    }
}

// JavaScript client
const socket = new WebSocket('ws://localhost:5000/ws');

socket.onopen = function() {
    console.log('Connected');
    socket.send('Hello from client');
};

socket.onmessage = function(event) {
    console.log('Server:', event.data);
};

πŸ’‘ WebSocket Tips

  • Use for real-time communication
  • Handle connection lifecycle
  • Broadcast to multiple clients
  • Handle errors gracefully
  • Consider SignalR for complex scenarios

“WebSockets in .NET Core enable real-time. Bidirectional communication. Essential for modern apps.”

β€” .NET Developer

Related posts:

AJAX Cache Nightmare β€” Why Your GET Requests Don’t Update

Silent AJAX Failures β€” Missing Content-Type

Ajax: Handling Network Failures Gracefully with Async/Await

Post Views: 2

Post navigation

JavaScript: Use Nullish Coalescing (??) for Defaults
Git: Use Revert to Undo Commits Safely

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

July 2026
M T W T F S S
 12345
6789101112
13141516171819
20212223242526
2728293031  
« Jun    

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (960)
  • How to add default value for Entity Framework migrations for DateTime and Bool (898)
  • How to make theater mode the default for Youtube (857)
  • Get the First and Last Word from a String or Sentence in SQL (840)
  • How to select distinct rows in a datatable in C# (814)
  • How to enable, disable and check if Service Broker is enabled on a database in SQL Server (597)
  • Add Constraint to SQL Table to ensure email contains @ (582)
  • Average of all values in a column that are not zero in SQL (545)
  • How to use Map Mode for Vertical Scroll Mode in Visual Studio (512)
  • Find numbers with more than two decimal places in SQL (460)

Recent Posts

  • C#: Use Using Statements for Resource Management
  • C#: Use Lambda Expressions for Concise Code
  • SQL: Use GROUP BY for Data Aggregation
  • .NET Core: Master Routing for Clean URLs
  • Git: Use Reset to Undo Local Changes
  • Ajax: Use Axios for HTTP Requests
  • JavaScript: Understand Hoisting
  • HTML: Use Web Storage for Client-Side Data
  • CSS: Use Filter Effects for Visual Magic
  • Windows 11: Unlock God Mode for All Settings

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (960)
  • How to add default value for Entity Framework migrations for DateTime and Bool (898)
  • How to make theater mode the default for Youtube (857)
  • Get the First and Last Word from a String or Sentence in SQL (840)
  • How to select distinct rows in a datatable in C# (814)

Recent Posts

  • C#: Use Using Statements for Resource Management
  • C#: Use Lambda Expressions for Concise Code
  • SQL: Use GROUP BY for Data Aggregation
  • .NET Core: Master Routing for Clean URLs
  • Git: Use Reset to Undo Local Changes

Social

  • ErcanOPAK.com
  • GoodReads
  • LetterBoxD
  • Linkedin
  • The Blog
  • Twitter
© 2026 Bits of .NET | Built with Xblog Plus free WordPress theme by wpthemespace.com