Push notification pushbroker.StopAllServices(PushSharp)处出错

Push notification pushbroker.StopAllServices(PushSharp)处出错,push-notification,pushsharp,Push Notification,Pushsharp,在推送Windows Phone时,我在推送服务中经常遇到异常情况,但并非总是如此。异常显示在调用StopAllServices时发生的一个或多个错误。推送服务只在推送到windows phone时报告这些错误,因此我现在认为我在windows代码中做了一些错误。请一位普什夏普大师看一下代码并提出建议?i、 我对这里的提问还很陌生,我们可以给人们贴标签以引起他们的注意吗?StopAllBrokers方法的catch中返回了不明确的错误 protected override void OnTime

在推送Windows Phone时,我在推送服务中经常遇到异常情况,但并非总是如此。异常显示在调用StopAllServices时发生的一个或多个错误。推送服务只在推送到windows phone时报告这些错误,因此我现在认为我在windows代码中做了一些错误。请一位普什夏普大师看一下代码并提出建议?i、 我对这里的提问还很陌生,我们可以给人们贴标签以引起他们的注意吗?StopAllBrokers方法的catch中返回了不明确的错误

protected override void OnTimer(ElapsedEventArgs e, ref bool StopService)
    {

        try
        {
            if (!ServiceState.Instance.RequestLock())
            {
                WriteLogEntry("Skipping MobileEx.Push.Service[" + Lib.AppPath + "]. In use", LogBase.EEventType.Warning);

                return;
            }

            int LoopCount = 0;

            while (LoopCount < Panztel.Shared.General.Settings.AppSettings.GetSettingValue("ProcessLimit", "100"))
            {
                LoopCount += 1;

                if (StopRequested)
                    break;

                using (var MyScope = new TransactionScope())
                {
                    var MyContext = DataContextHelper.NewContext;

                    var MyId = Guid.NewGuid();
                    Mobile.API.BusinessLogic.Data.Push MyItem = null;

                    try
                    {
                        MyItem = PushLogic.GrabItemToProcess(MyId, ref MyContext);
                    }
                    catch (Exception ex)
                    {
                        WriteLogEntry("Unable to get push item to process. " + ex.Message, LogBase.EEventType.Error);
                    }

                    if (MyItem == null)
                        break; // Drop out as nothing to process.

                    MyItem.ProcessId = MyId;

                    var MyApplications = PushLogic.GetPushApplicationListByPushId(MyItem.PushId, MyItem.CompanyLinkId, ref MyContext);

                    foreach (var MyPushApp in MyApplications)
                    {
                        var MyPhoneApp = PhoneLogic.GetPhoneApplicationItem(MyPushApp.PhoneId, MyPushApp.ApplicationId);

                        if (MyPhoneApp == null || string.IsNullOrEmpty(MyPhoneApp.PushChannelUri))
                        {
                            // Mark as failed and continue
                            MyPushApp.ProcessState = 15;
                            continue;
                        }

                        var MyQueue = GetPushBroker(MyItem.Phone.OsType, MyPhoneApp);

                        if (MyQueue == null)
                        {
                            MyPushApp.ProcessState = 16;
                            continue;
                        }

                        switch (MyItem.Phone.OsType)
                        {
                            case 1: // Android
                                var MyMsgHelper = new PushMessageHelper();

                                if (!string.IsNullOrEmpty(MyItem.Message))
                                    MyMsgHelper.AddItem("alert", MyItem.Message);

                                MyMsgHelper.AddItem("badge", "1");
                                MyMsgHelper.AddItem("pushtypeid", MyItem.PushTypeId.ToString());
                                MyMsgHelper.AddItem("notify", MyItem.IsNotificationRequired ? "1" : "0");

                                if (MyItem.LastrvNo.HasValue)
                                    MyMsgHelper.AddItem("lastrvno", MyItem.LastrvNo.Value.ToString());

                                var MessageInJson = MyMsgHelper.GetJsonMessage();

                                var MyNotification = new GcmNotification()
                                    .ForDeviceRegistrationId(MyPhoneApp.PushChannelUri)
                                    .WithCollapseKey("key_" + MyItem.PushId)
                                    .WithJson(MessageInJson)
                                    .WithTag(MyId.ToString());

                                MyQueue.QueueNotification(MyNotification);
                                break;

                            case 2: // Windows
                                //******************    RAW     *********************************//
                                var ThisMsgHelper = new PushMessageHelper();

                                if (!string.IsNullOrEmpty(MyItem.Message))
                                {
                                    ThisMsgHelper.AddItem("alert", MyItem.Message);
                                }

                                ThisMsgHelper.AddItem("badge", "1");
                                ThisMsgHelper.AddItem("pushtypeid", MyItem.PushTypeId.ToString());
                                ThisMsgHelper.AddItem("notify", MyItem.IsNotificationRequired ? "1" : "0");

                                if (MyItem.LastrvNo.HasValue)
                                    ThisMsgHelper.AddItem("lastrvno", MyItem.LastrvNo.Value.ToString());

                                var MessageInXml = ThisMsgHelper.GetWp8PushMessage();
                                var MyWindowsNotification = new WindowsPhoneRawNotification();
                                MyWindowsNotification.ForEndpointUri(new Uri(MyPhoneApp.PushChannelUri));
                                MyWindowsNotification.ForOSVersion(WindowsPhoneDeviceOSVersion.Eight);
                                MyWindowsNotification.WithBatchingInterval(BatchingInterval.Immediate);
                                MyWindowsNotification.WithRaw(MessageInXml);
                                MyWindowsNotification.Tag = MyId.ToString();

                                MyQueue.QueueNotification(MyWindowsNotification);

                                break;

                            case 3: // iPhone
                                var MyAppleNotification = new AppleNotification()
                                    .ForDeviceToken(MyPhoneApp.PushChannelUri)
                                    .WithTag(MyId.ToString())
                                    .WithCustomItem("pushtypeid", MyItem.PushTypeId.ToString(CultureInfo.InvariantCulture));

                                var MyMsg = MyItem.Message;
                                if (string.IsNullOrEmpty(MyMsg))
                                {
                                    if (MyItem.IsNotificationRequired)
                                    {
                                        switch (MyItem.PushTypeId)
                                        {
                                            case 3:
                                                MyMsg = "New schedule(s) received";
                                                break;

                                            case 4:
                                                MyMsg = "New message(s) received";
                                                break;
                                        }
                                    }
                                }

                                // if request location, add in the bit to do a background notification
                                // http://docs.xamarin.com/guides/cross-platform/application_fundamentals/backgrounding/part_3_ios_backgrounding_techniques/updating_an_application_in_the_background/

                                if (MyItem.PushTypeId == 5)
                                    MyAppleNotification = MyAppleNotification.WithContentAvailable(1);

                                if (!string.IsNullOrEmpty(MyMsg))
                                    MyAppleNotification = MyAppleNotification.WithAlert(MyMsg).WithBadge(1);

                                if (MyItem.IsNotificationRequired)
                                    MyAppleNotification = MyAppleNotification.WithSound("beep.aiff").WithBadge(1);

                                if (MyItem.LastrvNo.HasValue)
                                    MyAppleNotification = MyAppleNotification.WithCustomItem("lastrvno", MyItem.LastrvNo.Value.ToString());

                                MyQueue.QueueNotification(MyAppleNotification);
                                break;

                        }

                        MyPushApp.ProcessState = 5;
                    }

                    MyItem.ProcessState = 5;
                    PushLogic.UpdateItem(ref MyContext, MyItem);

                    MyScope.Complete();
                }
            }
        }
        catch (Exception ex)
        {
            WriteLogEntry("Error in MobileEx.Push.Service.PushWorker.OnTimer - " + ex.Message, LogBase.EEventType.Error);
        }
        finally
        {
            try
            {
                StopAllBrokers();
            }
            catch (Exception Ex)
            {
                WriteLogEntry("Error in MobileEx.Push.Service.PushWorker.OnTimer.StopAllBrokers - " + Ex.Message, LogBase.EEventType.Error);
            }

        }
        ServiceState.Instance.ReleaseLock();

    }

    private PushBroker GetPushBroker(short OsType, PhoneApplication MyPhoneApp)
    {
        PushBroker MyBroker;
        string Key = OsType + "." + MyPhoneApp.Application.PackageName.ToLower();

        if (_PushList == null)
            _PushList = new Dictionary<string, PushBroker>();

        if (_PushList.ContainsKey(Key))
        {
            MyBroker = _PushList[Key];
        }
        else
        {
            MyBroker = new PushBroker();
            MyBroker.OnNotificationFailed += Push_OnNotificationFailed;
            MyBroker.OnDeviceSubscriptionExpired += Push_OnDeviceSubscriptionExpired;
            MyBroker.OnNotificationSent += Push_OnNotificationSent;
            MyBroker.OnChannelException += MyBroker_OnChannelException;
            MyBroker.OnServiceException += MyBroker_OnServiceException;

            switch (OsType)
            {
                case 1: // Android
                    var SenderId = MyPhoneApp.Application.ProductGroup.SenderId;
                    var SenderAuth = MyPhoneApp.Application.ProductGroup.SenderAuth;
                    var PackageName = MyPhoneApp.Application.PackageName;

                    var MyGoogleChannelSettings = new GcmPushChannelSettings(SenderId, SenderAuth, PackageName);
                    MyBroker.RegisterGcmService(MyGoogleChannelSettings);

                    break;

                case 2: // Windows
                    MyBroker.RegisterWindowsPhoneService();
                    break;

                case 3: // iPhone
                    var CertificateFile = Panztel.Shared.General.Settings.AppSettings.GetSetting("ApplePushCertificate", "");
                    var CertificatePassword = Panztel.Shared.General.Settings.AppSettings.GetSetting("ApplePushCertificatePassword", "");
                    var IsProduction = Panztel.Shared.General.Settings.AppSettings.GetSettingValue("ApplePushProduction", "0") == 1;

                    if (string.IsNullOrEmpty(CertificateFile) || string.IsNullOrEmpty(CertificatePassword))
                        throw new Exception("Apple Push Certificate settings not configured");

                    if (!File.Exists(CertificateFile))
                        throw new Exception("Apple Push Certificate [" + CertificateFile + "] not found");

                    var CertificateData = File.ReadAllBytes(CertificateFile);
                    var MyAppleChannelSettings = new ApplePushChannelSettings(IsProduction, CertificateData, CertificatePassword);

                    // need to limit the number of channels we have for Apple otherwise they can return 
                    // "The maximum number of Send attempts to send the notification was reached!"

                    var MyServiceSettings = new PushServiceSettings();
                    MyServiceSettings.MaxAutoScaleChannels = 5;
                    MyServiceSettings.AutoScaleChannels = true;

                    MyBroker.RegisterAppleService(MyAppleChannelSettings, MyServiceSettings);                        
                    break;
            }

            _PushList.Add(Key, MyBroker);
        }

        return MyBroker;
    }

    private void StopAllBrokers()
    {
        if (_PushList == null)
            return;

        foreach (var MyItem in _PushList)
        {
            try
            {
                MyItem.Value.StopAllServices();
            }
            catch (Exception Ex)
            {
                WriteLogEntry("Error in MobileEx.Push.Service.PushWorker.OnTimer.StopAllBrokers.StopAllServices - " + Ex.Message, LogBase.EEventType.Error);
            }

        }

        _PushList = null;
    }

`

我不是专家,但如果你提供一个包含20行左右基本代码的测试应用程序,帮助你会容易得多。