Home > Mobile >  .NET WPF equivalent of laravel-echo
.NET WPF equivalent of laravel-echo

Time:04-14

I am building a simple restaurant management system in WPF. I have my backend in Laravel. I needed to setup a web socket to get real-time notifications on WPF app when a customer places an order from mobile app. I configured the web socket in Laravel using beyondcode/laravel-websockets. For ease, I tested the web socket on client side using laravel-echo with Vue. Everything works well there but I couldn't find any solution to replicate laravel-echo in C#.

Here is the code I am using in Vue.js with laravel-echo:

import Echo from "laravel-echo";
import Pusher from "pusher-js";
window.Pusher = Pusher;

const token = "1|CSaob3KZhU5UHiocBjPgzpazbceUKTLRLJO0ZIV0"

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'laravel_rdb',
    wsHost: '127.0.0.1',
    authEndpoint: 'http://localhost/may-app/public/broadcasting/auth',
    encrypted: false,
    forceTLS: false,
    wsPort: 6001,
    wssPort: 6001,
    disableStats: true,
    enabledTransports: ['ws', 'wss'],
    auth : {
        headers : {
            Authorization: "Bearer "   token,
            Accept: "application/json",
        }
    },
})

window.Echo.private('customer-order')
    .listen('OrderPlaced', (e) => {
    console.log(e)
})

I found SocketIOClient is used to implement web socket functionality in .NET. I tried to use a solution I found here but it didn't work for me. Also, I didn't find any way to set up my authentication URL in this package. I read socket.io documentation for anything related to authentication but I couldn't find any.

How do I implement equivalent functionality in C# .NET as in laravel-echo?

CodePudding user response:

There is probably no client like laravel-echo for .NET. However, you will be able to connect to your sockets using pusher client: pusher/pusher-websocket-dotnet and this is probably the highest level of compatibility you can reach. But you will need to parse your messages and subscribe to the channels by yourself, there will be no sweet wrapping like in laravel-echo =(

CodePudding user response:

I was able to implement a solution using the package mentioned by PunyFlash in the answers. The NuGet package is available here and here is the GitHub repo.

My solution might be useful for someone in the future so, my equivalent code for the laravel-echo code above, in .NET is:

internal class OrderSocket
    {
        public static async void Connect()
        {
            try
            {
                //Setting authentication
                var authorizer = new CustomAuthorizer("http://localhost/may-app/public/broadcasting/auth")
                {
                    AuthenticationHeader = new System.Net.Http.Headers.AuthenticationHeaderValue("Authorization", "Bearer "   "1|CSaob3KZhU5UHiocBjPgzpazbceUKTLRLJO0ZIV0"),
                };

                //Creating pusher object with authentication
                Pusher pusher = new Pusher("laravel_rdb", new PusherOptions
                {
                    Authorizer = authorizer,
                    Host = "127.0.0.1:6001",
                });

                //Connecting to web socket
                await pusher.ConnectAsync().ConfigureAwait(false);

                //Subscribing to channel
                Channel channel = await pusher.SubscribeAsync("private-customer-order").ConfigureAwait(false);
                if (channel.IsSubscribed)
                {
                    //Binding to an event
                    channel.Bind("App\\Events\\OrderPlaced", (PusherEvent eventResponse) =>
                    {
                        // Deserialize json if server returns json values
                        Debug.WriteLine(eventResponse.Data);
                    });
                }
            }
            catch (Exception)
            {
                Debug.WriteLine("An exception occurred.");
            }
        }
    }

    //HttpAuthorizer child class to set default headers
    internal class CustomAuthorizer : HttpAuthorizer
    {
        public CustomAuthorizer(string authEndpoint) : base(authEndpoint) { }

        public override void PreAuthorize(HttpClient httpClient)
        {
            base.PreAuthorize(httpClient);
            httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
        }
    }
  • Related