Мне нужно подписаться на канал присутствия, но в строке кода подписки выдается исключение «Невозможно выполнить привязку во время выполнения для нулевой ссылки» (трассировка стека ниже), когда я пытаюсь подписаться на канал c publi, без аутентификации не выдает никакой ошибки, но, добавив несколько точек останова, я вижу, что канал имеет имя, но не подписан, а идентификатор сокета равен нулю.
Stacktrace:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot perform runtime binding on a null reference
at at (wrapper dynamic-method) System.Object.CallSite.Target(System.Runtime.CompilerServices.Closure,System.Runtime.CompilerServices.CallSite,object)
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet] (System.Runtime.CompilerServices.CallSite site, T0 arg0) [0x00112] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/external/corefx/src/System.Linq.Expressions/src/System/Dynamic/UpdateDelegates.Generated.cs:125
at MasterDetailPageNavigation.XAML.Chat.ListMembers () [0x00025] in /Users/eder/Documents/Projeto Teste/MasterDetailPageNavigation/XAML/Chat.xaml.cs:69
at MasterDetailPageNavigation.XAML.Chat.PresenceChannel_Subscribed (System.Object sender) [0x00001] in /Users/eder/Documents/Projeto Teste/MasterDetailPageNavigation/XAML/Chat.xaml.cs:78
at PusherClient.Channel.SubscriptionSucceeded (System.String data) [0x00018] in <906d72d03341492ea1108e4ba5db39cb>:0
at PusherClient.GenericPresenceChannel`1[T].SubscriptionSucceeded (System.String data) [0x0000d] in <906d72d03341492ea1108e4ba5db39cb>:0
at PusherClient.Pusher.PusherClient.IPusher.SubscriptionSuceeded (System.String channelName, System.String data) [0x0003a] in <906d72d03341492ea1108e4ba5db39cb>:0
at PusherClient.Connection.websocket_MessageReceived (System.Object sender, WebSocket4Net.MessageReceivedEventArgs e) [0x0018e] in <906d72d03341492ea1108e4ba5db39cb>:0
at WebSocket4Net.WebSocket.FireMessageReceived (System.String message) [0x00016] in <4cb06ef8575846faa96238206314da14>:0
at WebSocket4Net.Command.Text.ExecuteCommand (WebSocket4Net.WebSocket session, WebSocket4Net.WebSocketCommandInfo commandInfo) [0x00007] in <4cb06ef8575846faa96238206314da14>:0
at WebSocket4Net.WebSocket.ExecuteCommand (WebSocket4Net.WebSocketCommandInfo commandInfo) [0x00015] in <4cb06ef8575846faa96238206314da14>:0
at WebSocket4Net.WebSocket.OnDataReceived (System.Byte[] data, System.Int32 offset, System.Int32 length) [0x00032] in <4cb06ef8575846faa96238206314da14>:0
at WebSocket4Net.WebSocket.client_DataReceived (System.Object sender, SuperSocket.ClientEngine.DataEventArgs e) [0x00013] in <4cb06ef8575846faa96238206314da14>:0
at SuperSocket.ClientEngine.ClientSession.OnDataReceived (System.Byte[] data, System.Int32 offset, System.Int32 length) [0x0002f] in <dbd80dafc8794140aef5960a6254d156>:0
at SuperSocket.ClientEngine.AsyncTcpSession.ProcessReceive (System.Net.Sockets.SocketAsyncEventArgs e) [0x00060] in <dbd80dafc8794140aef5960a6254d156>:0
at SuperSocket.ClientEngine.AsyncTcpSession.SocketEventArgsCompleted (System.Object sender, System.Net.Sockets.SocketAsyncEventArgs e) [0x00019] in <dbd80dafc8794140aef5960a6254d156>:0
at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted (System.Net.Sockets.SocketAsyncEventArgs e) [0x0000e] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/mcs/class/System/System.Net.Sockets/SocketAsyncEventArgs.cs:213
at System.Net.Sockets.SocketAsyncEventArgs.Complete () [0x00009] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/mcs/class/System/System.Net.Sockets/SocketAsyncEventArgs.cs:203
at System.Net.Sockets.Socket+<>c.<.cctor>b__318_7 (System.IAsyncResult ares) [0x0005d] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/mcs/class/System/System.Net.Sockets/Socket.cs:1515
at System.Net.Sockets.SocketAsyncResult+<>c.<Complete>b__27_0 (System.Object state) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/mcs/class/System/System.Net.Sockets/SocketAsyncResult.cs:157
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () [0x00015] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/mcs/class/referencesource/mscorlib/system/threading/threadpool.cs:1337
at System.Threading.ThreadPoolWorkQueue.Dispatch () [0x00074] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/mcs/class/referencesource/mscorlib/system/threading/threadpool.cs:899
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/mcs/class/referencesource/mscorlib/system/threading/threadpool.cs:1261
Мой код:
public Chat(string userid)
{
InitializeComponent();
Task.Run(()=> InitPusher());
}
public static Pusher _pusher = new Pusher("key", new PusherOptions()
{
Cluster = "us2",
Authorizer = new HttpAuthorizer("pusher_auth_presence.php?userid=" + Application.Current.Properties["userid"] as string)
});
public static PresenceChannel _presenceChannel;
public static async Task InitPusher()
{
try
{
_presenceChannel = (PresenceChannel)_pusher.SubscribeAsync("presence-chatchannel").Result;
}
catch(Exception e)
{
Console.WriteLine("ERROR:" + e.Message); // this is never caught
}
_pusher.ConnectionStateChanged += _pusher_ConnectionStateChanged;
_pusher.Error += _pusher_Error;
// Setup presence channel
_presenceChannel.Subscribed += PresenceChannel_Subscribed;
_presenceChannel.MemberAdded += PresenceChannel_MemberAdded;
_presenceChannel.MemberRemoved += PresenceChannel_MemberRemoved;
await _pusher.ConnectAsync();
}
static void ListMembers()
{
var users = new List<string>();
foreach (var mem in _presenceChannel.Members)
{
users.Add((string)mem.Value.id.Value);
}
Console.WriteLine("[MEMBERS] " + users.Aggregate((i, j) => i + ", " + j));
}
// Presence Channel Events
static void PresenceChannel_Subscribed(object sender)
{
ListMembers();
}
static void PresenceChannel_MemberAdded(object sender, KeyValuePair<string, dynamic> member)
{
Console.WriteLine((string)member.Value.name.Value + " has joined");
ListMembers();
StatusOnline(true);
}
static void PresenceChannel_MemberRemoved(object sender)
{
ListMembers();
}
private static async void StatusOnline(bool x)
{
Online = "online";
}
public static void _pusher_ConnectionStateChanged(object sender, ConnectionState state)
{
Console.WriteLine("Conexao pusher: "+state.ToString());
}
public static void _pusher_Error(object sender, PusherException error)
{
Console.WriteLine("Conexao pusher: "+ error.ToString());
}
PHP Код (я знаю, что это небезопасно, но только для целей тестирования):
pusher_auth_presence. php
<?php
require '/var/www/pusher/autoload.php';
$options = array('cluster' => 'us2','useTLS' => true);
$pusher = new Pusher\Pusher('xxxxx','yyyyyyy','zzzzzzz',$options);
echo $pusher->presence_auth($_POST['channel_name'], $_POST['socket_id'],$_GET['userid']);
?>