• ASP.NET WebSockets basics

    Back in 2012, ASP.NET 4.5 and IIS 8 shipped with built-in support for WebSockets. If you plan to support using WebSockets on the server today, you’ll most likely use SignalR, which makes this all quite easy, but I thought it would be educational to take a step back and see what’s involved in just using the framework’s basic support.

    To try this out I created a new ASP.NET MVC web project.

    I then added a new ‘Generic Handler’ item to the project and named it MyHandler.ashx

    The contents of this hander are based on the example from What’s New in ASP.NET 4.5. It essentially echoes any content received back to the caller:

    using System;
    using System.Net.WebSockets;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Web;
    using System.Web.WebSockets;
    
    namespace DemoWebSockets
    {
        public class MyHandler : IHttpHandler
        {
            public void ProcessRequest(HttpContext context)
            {
                context.AcceptWebSocketRequest(ProcessWebSocket);
            }
    
            public bool IsReusable
            {
                get { return false; }
            }
    
            private async Task ProcessWebSocket(AspNetWebSocketContext context)
            {
                var socket = context.WebSocket;
                while (true)
                {
                    var buffer = new ArraySegment(new byte[1024]);
    
                    // Asynchronously wait for a message to arrive from a client
                    var result = await socket.ReceiveAsync(buffer, CancellationToken.None);
    
                    // If the socket is still open, echo the message back to the client
                    if (socket.State == WebSocketState.Open)
                    {
                        var userMessage = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
                        userMessage = string.Format("You sent: {0} at {1}", userMessage, DateTime.Now.ToLongTimeString());
                        buffer = new ArraySegment(Encoding.UTF8.GetBytes(userMessage));
    
                        // Asynchronously send a message to the client
                        await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
    }
    

    I then modified the index.cshtml page

    <div class="row">      
        <div class="col-md-12">
            <label for="msgText">Text to send:</label>        
            <input id="msgText" type="text" /><br />        
            <input id="Trigger" type="button" onclick="CallWebSocket(); return false;" value="Send" />
            <hr />
        <div id="serverData"></div>
    
    <script type="text/javascript">
        var socket = new WebSocket("ws://localhost:51057/MyHandler.ashx");
        // Receive a string message from the server.     
        socket.onmessage = function (msg) {
            document.getElementById("serverData").innerHTML = msg.data;
        };     
            
        function CallWebSocket() {         
            if (socket.OPEN) {             
                // Send a string message from the browser.             
                socket.send(document.getElementById("msgText").value);         
            }     
        }
    </script>
    

    And here’s the finished product:

    Screenshot showing example of web page

    Youssef also shows how to create a handler using WebAPI, and server-side configuration to enable IIS WebSocket support.

  • Jon Galloway on new things in ASP.NET 5 and ASP.NET MVC 6

    We’ve got another “big name international speaker” for ADNUG this month!

    Photo of Jon GallowayNext week, we’re joined by Jon Galloway, a Microsoft Technical Evangelist based in San Diego, California. Jon will be speaking about the new features coming in both ASP.NET 5 and ASP.NET MVC 6. I assume we’ll see the final versions of these around the same time that Visual Studio 2015 ships.

    I first came across Jon through his being one of the presenters of the Herding Code podcast (I’ve been listening since 2009). More recently, I’ve watched some of his courses on Microsoft Virtual Academy, seen him appear weekly in the ASP.NET 5 Community Stand-ups and been following him on Twitter. He’s an engaging, knowledgeable, down-to-earth presenter and I’m anticipating it will be a great meeting.

    If you’re in Adelaide, then please register and come along on Thursday 9th April at 12 noon, Microsoft Adelaide, Level 12, 147 Pirie St, Adelaide. Register via http://www.meetup.com/Adelaide-dotNET/events/221073867/

    If you’re out of town or just can’t make it in person, then we’ll be running the session via a Google Hangout – so you can still participate in the live session or watch the recording after the event on YouTube.

    Look forward to seeing you there in person or online 😀.

  • ALTER AUTHORIZATION

    (For my own reference)

    To resolve this issue in Microsoft SQL Server (often observed when you restore a database that came from another server):

    SQL Server Management Studio information dialog

    Run this:

    alter authorization on database::[MyDbName] to sa;