locked
关于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

答案

全部回复

  • 你好,

    第一个问题, 关于FirstChanceException你可以看看这个MSDN的解释,https://msdn.microsoft.com/zh-cn/library/system.appdomain.firstchanceexception(v=vs.110).aspx

    第二个问题,你用的是sliverlight还是runtimewindows phone 8.1 工程? 有一种情况下面find方法会返回nullMSDN的文档上面有提到,你可以到下面的链接看看。https://msdn.microsoft.com/library/windows/apps/dn642085(v=vs.105).aspx#BKMK_UsingMPN 很抱歉这个页面没有中文版的。文档比较靠前的位置还指出了如何正确的选择MPNS还是WNS

    第三个问题,模拟器的设置里面有对应的选项,跟手机的配置是一样的。

    总而言之,对于你的问题,我认为在第二个问题的文档已经给出了回答,请仔细看一下。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年3月31日 5:33
  • 您好,

    感谢您的耐心回答.遵循文档的步骤,目前代码已经能正常运行.

    2015年3月31日 8:16