.NET WPF-эквивалент laravel-echo

Я создаю простую систему управления рестораном в WPF. У меня есть мой бэкэнд в Laravel. Мне нужно было настроить веб-сокет, чтобы получать уведомления в режиме реального времени в приложении WPF, когда клиент размещает заказ из мобильного приложения. Я настроил веб-сокет в Laravel, используя . Для простоты я протестировал веб-сокет на стороне клиента, используя Vue. Там все работает хорошо, но я не смог найти решения для репликации на С#.

Вот код, который я использую в Vue.js с :

      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)
})

Я обнаружил , что SocketIOClient используется для реализации функций веб-сокетов в .NET. Я попытался использовать решение, которое нашел здесь, но оно не сработало для меня. Кроме того, я не нашел способа настроить URL-адрес аутентификации в этом пакете. Я читал документацию socket.io для всего, что связано с аутентификацией, но ничего не нашел.

Как мне реализовать эквивалентную функциональность в C# .NET, как в laravel-echo?

2 ответа

Вероятно, нет такого клиента, как laravel-echo для .NET. Однако вы сможете подключиться к своим сокетам с помощью push-клиента: pusher/pusher-websocket-dotnetи это, вероятно, самый высокий уровень совместимости, которого вы можете достичь. Но парсить сообщения и подписываться на каналы нужно будет самостоятельно, не будет сладкой накрутки как в laravel-echo =(

Мне удалось реализовать решение, используя пакет, упомянутый user10249529 в ответах. Пакет NuGet доступен здесь, а вот репозиторий GitHub.

Мое решение может быть полезно для кого-то в будущем, поэтому мой эквивалентный код для код выше, в .NET:

      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");
        }
    }
Другие вопросы по тегам