Ошибка при подписке на канал в C# - PullRequest
0 голосов
/ 05 февраля 2020

Мне нужно подписаться на канал присутствия, но в строке кода подписки выдается исключение «Невозможно выполнить привязку во время выполнения для нулевой ссылки» (трассировка стека ниже), когда я пытаюсь подписаться на канал 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']);
?>
...