zoukankan      html  css  js  c++  java
  • Windows Azure Service Bus Notification Hub推送通知

    前言

    随着Windows Azure 在中国的正式落地,相信越来越多的人会体验到Windows Azure带来的强大和便利。在上一篇文章中, 我们介绍了如何利用Windows Azure中的Service Bus的中继功能(Relay),来将您的WCF服务册到Windows Azure Service Bus上。 而WCF客户端可以通过访问Service Bus endpoint, 从而访问到您真正的WCF服务。
    在这篇文章中,我们将介绍Windows Azure Service Bus的另外一个功能:通知中心(Notification Hub)。 (说明: 该功能目前还处于Preview阶段)
    在很多应用系统中,通过Publisher |Subscriber 模型 来实现消息推送是一个常用的功能。实现方法也有很多,且较为复杂。幸运的是,在Windows Azure Service Bus中, 我们提供一个功能:通知中心(Notification Hub), 可以非常方便地实现大批量的推送通知的功能。
    下面, 我就以开发一个简单的Windows 8 application为例,介绍如何利用这个功能实现Toast notification。

    前提条件

    1. 开发环境:Visual Studio 2012 + Windows 8
    2. Windows Azure 账号 (您可以通过以下地址免费申请一个: http://www.azure.com)
    3. Windows 8开发者账号。
    4. Service Bus WinRT Preview SDK (http://go.microsoft.com/fwlink/?LinkID=277160)

    正文

    第一部分:配置

    1. 首先, 您可以创建一个用于演示的Windows Store application。为了接收推送下来的Toast Notification,您必须先要开启该功能, 如下所示:

    2. 然后,将该application和Windows Store关联起来,并在Windows Store里面正确配置该application, 比如Notification等等,并获取正确的Package Security Identifier (SID) 和Client secret。

    里面最关键的一步,是要配置你的application的推送通知的功能,并获得相应的Package Security Identifier (SID) 和Client secret。
    比如:下面就是我配置后生成的相应SID和Client secret:

    3. 接下来, 我们需要回到Windows Azure  Management Portal, 创建一个Notification Hub。 比如,我在namesapce4push下,创建了一个叫做myhub的 Notification Hub,如下所示:

    4. 然后,给刚才创建的Notification Hub : myhub 指定相应的Package SID和Client Secret,使得我们自己开发的application和该notification hub关联起来,如下所示:

    最后点击保存。

    5. 上述设置结束之后,回到Visual Studio,其会自动检测到这一行为,点击下一步直至结束,这样该application和store成功关联起来了。

    第二部分:编写代码

    1. 在application里面,我们需要在程序启动的时候,完成一些初始化的动作,比如该application在Notification Hub的注册等。
    下面用黄色高亮显示的部分为相关代码:

    using PushDemo.Common;
    
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using Windows.ApplicationModel;
    using Windows.ApplicationModel.Activation;
    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.Threading.Tasks;
    
    using Microsoft.WindowsAzure.Messaging;
    using Windows.Networking.PushNotifications;
    using Windows.UI.Notifications;
    using Windows.Data.Xml.Dom;
    
    // The Grid App template is documented at http://go.microsoft.com/fwlink/?LinkId=234226
    
    namespace PushDemo
    {
        /// <summary>
        /// Provides application-specific behavior to supplement the default Application class.
        /// </summary>
        sealed partial class App : Application
        {
            /// <summary>
            /// Initializes the singleton Application object.  This is the first line of authored code
            /// executed, and as such is the logical equivalent of main() or WinMain().
            /// </summary>
            /// 
    
            NotificationHub notificationHub;
    
            public App()
            {
                var cn = ConnectionString.CreateUsingSharedAccessSecretWithListenAccess(
                    new Uri("sb://namespace4push.servicebus.windows.net/"),
                    "******<listenAccessSecret>******"
                    );
    
                notificationHub = new NotificationHub("myhub", cn);
    
                this.InitializeComponent();
                this.Suspending += OnSuspending;
            }
    
    
            async Task InitializeNotificationsAsync()
            {
                var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
                await notificationHub.RefreshChannelUriAsync(channel.Uri);
    
                if (!await notificationHub.TemplateRegistrationExistsAsync("myToastRegistration"))
                    await notificationHub.CreateTemplateRegistrationAsync(BuildTextToastTemplate(), "myToastRegistration");
            }
    
    
            XmlDocument BuildTextToastTemplate()
            {
                var template =
                    ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText01);
                var textNode = template.SelectSingleNode("//text[@id='1']") as XmlElement;
                if (textNode != null)
                {
                    textNode.InnerText = "$(msg)";
                }
                return template;
            }
    
            /// <summary>
            /// Invoked when the application is launched normally by the end user.  Other entry points
            /// will be used when the application is launched to open a specific file, to display
            /// search results, and so forth.
            /// </summary>
            /// <param name="args">Details about the launch request and process.</param>
            protected override async void OnLaunched(LaunchActivatedEventArgs args)
            {
                await InitializeNotificationsAsync();
    
                Frame rootFrame = Window.Current.Content as Frame;
    
                // Do not repeat app initialization when the Window already has content,
                // just ensure that the window is active
                
                if (rootFrame == null)
                {
                    // Create a Frame to act as the navigation context and navigate to the first page
    …
    …
                }
                // Ensure the current window is active
                Window.Current.Activate();
            }
    
            /// <summary>
            /// Invoked when application execution is being suspended.  Application state is saved
            /// without knowing whether the application will be terminated or resumed with the contents
            /// of memory still intact.
            /// </summary>
            /// <param name="sender">The source of the suspend request.</param>
            /// <param name="e">Details about the suspend request.</param>
    …
    …
        }
    }

    2. 接下来我们需要一个用来推送消息的后台程序。我们就用一个非常简单的windows console程序来模拟后台好了。相关的代码如下:

    class Program
        {
            static void Main(string[] args)
            {
                var cn = ServiceBusConnectionStringBuilder.CreateUsingSharedAccessKey(
                    new Uri("sb://namespace4push.servicebus.windows.net/"),
                    Microsoft.ServiceBus.Notifications.NotificationHubDescription.DefaultFullSasRuleName,
                    "*****<Access key>********”
                    );
    
                var hbClient = Microsoft.ServiceBus.Notifications.NotificationHubClient.CreateClientFromConnectionString(cn, "myhub");
                hbClient.SendTemplateNotification(new Dictionary<string, string>
                {
                   {"msg",args.Length>0? args[0]:"Hello World, Service Bus Notification Hub"}
                }
                );
            }
       }

    3. 运行后的效果如下:
    1)首先, 我们用我们的模拟后台消息推送程序推送一条消息给Notification Hub,如下:

    2)因为我们的Windows Store Application注册到了Service Bus Notification Hub。 因此,所有安装该application的终端都会马上收到一个Toast Notification,如下:

    也就是说, 假设我们有1万个终端的话, 那么这一万个终端会同时收到该Toast Notification.
    说明:在Notification Hub Preview阶段,目前一个Notification Hub最多支持10,000个注册。如果需要超过1万个的注册,需要和我们的产品组联系以便特殊处理。

    参考文档:

    1) How To: Service Bus Notification Hubs (Windows Store Apps)
    http://msdn.microsoft.com/en-us/library/windowsazure/jj927172.aspx
    2) Creating Windows Store Apps with Windows Azure Notification Hubs
    http://blogs.msdn.com/b/zxue/archive/2013/01/24/creating-windows-store-apps-with-windows-azure-notification-hubs.aspx

    希望以上内容对您有所帮助

    Winston He

      

  • 相关阅读:
    浅谈数据结构之KMP(串中的模式匹配算法)
    electron 使用serialport串口库
    electron-builder 打包时下载 winCodeSign和nsis缓慢解决方法
    【SQL / MySQL】Hierarchical Queries (层级结构查询)
    delphi MSSQL表类型传参
    DevExpress ComboboxEdit绑定key value值
    devexpress gridControl1导出为pdf文件时出现 中文乱码的解决方案
    DevExpress的GridControl控件设置自定义显示方法
    Reactive Spring实战 -- 响应式MySql交互
    Reactive Spring实战 -- 响应式Kafka交互
  • 原文地址:https://www.cnblogs.com/developersupport/p/Azure-Service-Bus-Notification-Hub.html
Copyright © 2011-2022 走看看