.NET WPF-эквивалент laravel-echo
Я создаю простую систему управления рестораном в WPF. У меня есть мой бэкэнд в Laravel. Мне нужно было настроить веб-сокет, чтобы получать уведомления в режиме реального времени в приложении WPF, когда клиент размещает заказ из мобильного приложения. Я настроил веб-сокет в Laravel, используя
Вот код, который я использую в 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.
Мое решение может быть полезно для кого-то в будущем, поэтому мой эквивалентный код для
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");
}
}