none
关于Windows Phone 8.1 创建HttpNotificationChannel 获取Uri的问题. RRS feed

  • 问题

  • 大家好,我是一名学生,之前没学过Windows Phone开发,也极少用到Visual Studio.
          最近在实现一个Windows Phone的消息推送功能,我按照官方文档上的流程,根据以下代码尝试创建一个HttpNotificationChannel.但是在运行的过程中,执行到pushChannel = HttpNotificationChannel.Find(channelName);这一行的时候就会抛异常,但是这个异常 VS 没有提示具体的行数.提示的是"System.Exception的机会异常在第一次可能发生",程序就退出了.

    有几个问题想请教大家,都是在我几番百度Google之后没有得到有效的解决方法汇总出来的,希望大家能够帮帮我.(可能异常描述我记得不是很清楚,今晚回到学校我会重现并记录下来再修改)

    1.这个System.Exception没有提示是第几行的什么错误,而只是像"机会异常"这样的描述来提示.我应该遵行怎样的debug步骤去找出代码或者VS设置的问题?
    2.在WindowsPhone 8.1里面的推送还是不是引用Windows.Phone.Notification中的方法,还是统一用Windows应用商店的那个PushNotifications?
    3.在MSDN的官方文档:https://msdn.microsoft.com/zh-cn/library/hh202940(v=vs.92).aspx 中有提及: 
    "若要使用 Microsoft 推送通知服务,您必须将 Windows Phone 应用程序设置为从 Microsoft 推送通知服务接收推送通知。"
    这个接受消息与推送的选项,我在一个朋友的Windows Phone 7的手机上找到了设置.在Windows Phone 8.1模拟器上找不到设置.是不是在WP8/WP8.1里面默认开启接受微软的消息推送?
    我用的是模拟器,会不会因为这个原因不能创建Notification Channel?



    ====本机环境以及出错代码====
    1.
    Windows 8.1 专业版
    VS版本:VS2013 with Update 4
    SDK版本:Windows Phone SDK 8.1
    插曲是:我先是安装了VS 2015 预览版.后来发现不能正常引用 Windows Phone 8.1 SDK的 dll.然后我立刻在没卸载VS2015的情况下,安装了VS2013,发现两个不同版本的VS 所带的Windows Phone 8.1 build 的dll文件夹有很大的不同.
    所以后来我又立刻手动卸载干净VS2015和VS2013.全新安装一遍VS2013,我这份代码才能看上去没报错误,能正常解决引用的问题.
    
    2.下面是出错的代码.跟官方文档的样例代码基本一样,只是我设置了按钮触发创建httpNotificationChannel的函数.
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Runtime.InteropServices.WindowsRuntime;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Navigation;
    using System.Net;
    using System.Diagnostics;
    using Microsoft.Phone.Notification;
    // “空白页”项模板在 http://go.microsoft.com/fwlink/?LinkId=391641 上有介绍
    namespace MPPS_WP3
    {
        /// <summary>
        /// 可用于自身或导航至 Frame 内部的空白页。
        /// </summary>
        public sealed partial class MainPage : Page
        {
            HttpWebRequest mppsRequest = null;
            HttpWebResponse mppsResponse = null;
            public MainPage()
            {
                this.InitializeComponent();
                //this.NavigationCacheMode = NavigationCacheMode.Required;
               
            }
            /// <summary>
            /// 在此页将要在 Frame 中显示时进行调用。
            /// </summary>
            /// <param name="e">描述如何访问此页的事件数据。
            /// 此参数通常用于配置页。</param>
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                // TODO: 准备此处显示的页面。
                // TODO: 如果您的应用程序包含多个页面,请确保
                // 通过注册以下事件来处理硬件“后退”按钮:
                // Windows.Phone.UI.Input.HardwareButtons.BackPressed 事件。
                // 如果使用由某些模板提供的 NavigationHelper,
                // 则系统会为您处理该事件。
                
            }
            private void buttonLogin_Click(object sender, RoutedEventArgs e)
            {
                Debug.WriteLine("登陆按钮点击");
                String userName = inputUserName.Text;
                String passWord = inputPassWord.Password.ToString();
                Debug.WriteLine("Username:{0} Password:{1} Notification URI:", userName, passWord);
                //创建推送URI
                HttpNotificationChannel mppsChannel = null;
                string channelName = "mppsWinPhoneChannel";
                //mppsChannel = HttpNotificationChannel.Find(channelName);
                if (mppsChannel == null)
                {
                    mppsChannel = new HttpNotificationChannel(channelName);
                    mppsChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(mppsChannel_ShellToastNotificationReceived);
                    mppsChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(mppsChannel_ErrorOccurred);
                    mppsChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(mppsChannel_ChannelUriUpdated);
                    mppsChannel.Open();
                    //绑定到开始屏幕Toast通知
                    mppsChannel.BindToShellToast();
                    Debug.WriteLine("绑定到开始屏幕通知");
                }
                else
                {
                    mppsChannel = new HttpNotificationChannel(channelName);
                    mppsChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(mppsChannel_ShellToastNotificationReceived);
                    mppsChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(mppsChannel_ErrorOccurred);
                    mppsChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(mppsChannel_ChannelUriUpdated);
                    Debug.WriteLine("设备当前URI:{0}",mppsChannel.ChannelUri.ToString());
                }
                    
            }
            
            private void mppsChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
            {
                
                Debug.WriteLine("更新的Uri:{0}", e.ChannelUri.ToString());
            }
            private void mppsChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
            {
                Debug.WriteLine("发生错误:{0}", e.Message);
            }
            private void mppsChannel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
            {
                Debug.WriteLine("开始接受Toast推送","");
            }
            
            //控制WebRequest请求的发送与关闭
            private void sendLoginInfo(String mppsLoginUrl)
            {
                mppsRequest = (HttpWebRequest)WebRequest.Create(mppsLoginUrl);
                mppsRequest.Method = "GET";
                //mppsRequest.BeginGetRequestStream(new AsyncCallback(getLoginResponseCallBack), null);
                IAsyncResult result = (IAsyncResult)mppsRequest.BeginGetResponse(getLoginResponseCallBack, mppsRequest);
            }
            private void getLoginResponseCallBack(IAsyncResult result)
            {
                HttpWebRequest request = (HttpWebRequest)result.AsyncState;
                WebResponse response = request.EndGetResponse(result);
                using (Stream stream = response.GetResponseStream())
                using (StreamReader reader = new StreamReader(stream))
                {
                    string contents = reader.ReadToEnd();
                    Debug.WriteLine(contents);
                }
            }
        }
    }


    2015年3月30日 7:20

答案

全部回复