前言

Windows 推送服务(WNS)也是 Win10 通知机制中的一种,今天与大家一起学习一下有关WNS的相关知识。使用 Windows 推送服务的前提是你需要有一个微软开发者账号,这样才能得到一些合法的密钥信息用于与WNS服务器完成通讯操作。

附上一张关于消息推送原理图:

(来自 MSDN )

创建消息通道

使用 PushNotificationChannelManager 中的 CreatePushNotificationChannelForApplicationAsync() 创建 PushNotificationChannel 对象,通过订阅事件 PushNotificationReceived 接收 WNS 推送的消息。这里需要主意的是,PushNotificationChannel 内的 Url 属性。 WNS服务器怎么才能知道消息该推送给谁,就是依赖 Url 属性。

PushNotificationChannel pushNotificationChannel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
pushNotificationChannel.PushNotificationReceived += PushNotificationChannel_PushNotificationReceived;
private void PushNotificationChannel_PushNotificationReceived(PushNotificationChannel sender,
PushNotificationReceivedEventArgs args)
{
if (args.NotificationType == PushNotificationType.Toast)
{
ToastNotificationManager.CreateToastNotifier().Show(args.ToastNotification);
}
}

推送请求

这个过程分为两步进行:

  • OAuth 认证
  • 推送消息请求

了解OAuth认证的童鞋应该知道,我们应该具有一些合法的密钥信息,才能让目标服务器信任我们,然后我们才能进行真正的请求。而与WNS打交道时所有的密钥信息从哪来呢?这就需要微软开发者账号

登录微软开发者网站,打开你的仪表盘(DashBoard),如果你还没有应用就先创建一个应用。在应用详情里选择 服务推送通知

打开下图中链接

看到了么?这就是我们需要的信息

在进行 OAuth 认证我们需要 SIDClient_Id ,下面我们模拟一下 AppServiceWNS OAuth认证过程

HttpClient httpClient = new HttpClient();
Dictionary<string, string> @params = new Dictionary<string, string>
{
{"grant_type", "client_credentials"},
{
"client_id",
"ms-app://************* SID ********************"
},
{"client_secret", "/********** Client Id *************"},
{"scope", "notify.windows.com"}
}; HttpFormUrlEncodedContent httpFormUrlEncodedContent = new HttpFormUrlEncodedContent(@params);
httpFormUrlEncodedContent.Headers["Content-Type"] = "application/x-www-form-urlencoded";
var response =
await httpClient.PostAsync(new Uri("https://login.live.com/accesstoken.srf"), httpFormUrlEncodedContent); string content = await response.Content.ReadAsStringAsync();

认证成功后,可以得到 access_token ,这样我们的身份就合法了。

{
"access_token":"*****************/****************=",
"token_type":"bearer"
}

OAuth认证通过以后,就可以向WNS发送真正的推送请求了。下面我们模拟一下 AppService 是如何给 Client 推送 Toast消息

HttpClient httpClient2 = new HttpClient();

HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri(ChannelUrl));
httpRequestMessage.Headers.Add("Authorization", "Bearer " + access_token);
httpRequestMessage.Headers.Add("X-WNS-Type", "wns/toast"); string toastContent = @"
<toast>
<visual>
<binding template='ToastGeneric'>
<text>Hello World!</text>
<text>This is the first Example!</text>
</binding>
</visual>
</toast>"; HttpStringContent httpStringContent = new HttpStringContent(toastContent);
httpStringContent.Headers["Content-Type"] = "text/xml";
httpStringContent.Headers["Content-Length"] =
Encoding.UTF8.GetBytes(toastContent.ToCharArray()).Length.ToString(); httpRequestMessage.Content = httpStringContent; var response2 = await httpClient.SendRequestAsync(httpRequestMessage);

该注意的是 ChannelUrl 就是客户端在创建 PushNotificationChannel 对象中的 Url 的值。请求成功后,WNS就会根据Url推送给与之对应的客户端。

结束

到此为止,我们已经实现一个远程推送的 DEMO。当然 WNS 里还有许多知识没有提及到,比如除了Toast通知外,我们可以推送Tile等其他类型的通知。推荐大家去仔细阅读一下官方的说明文档,后续我也会补充WNS额外的内容。

参考链接

Windows 推送通知服务 (WNS) 概述

推送通知服务请求和响应头

[Win10应用开发] 使用 Windows 推送服务的更多相关文章

  1. python 3.5构建WINDOWS推送服务

    import ConfigParser import os import sys cf = ConfigParser.ConfigParser() #绝对路径获取 ABSPATH=os.path.ab ...

  2. Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  3. Netty_Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  4. 【netty】Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  5. Windows 8.1——将网站固定到开始菜单,自定义图标、颜色和Windows推送通知

    记得在IE 9和Windows 7刚出来那会儿我写过一篇文章来介绍如何自定义网站将其固定到Windows的任务栏上,同时自定义图标及任务内容.那个功能在IE 9中被称之为JumpList.http:/ ...

  6. 将网站固定到开始菜单,自定义图标、颜色和Windows推送通知

    Windows 8.1——将网站固定到开始菜单,自定义图标.颜色和Windows推送通知 记得在IE 9和Windows 7刚出来那会儿我写过一篇文章来介绍如何自定义网站将其固定到Windows的任务 ...

  7. Netty系列之Netty百万级推送服务设计要点(转)

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  8. Netty学习总结(3)——Netty百万级推送服务

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  9. 2014年国内经常使用移动client推送服务介绍和比較

    经过5年移动互联网的迅速发展,如今推送服务方面国内已经出现了非常多产品,比如极光推送,个推,一推,百度推送,友盟推送等,我们在选择推送服务时,首先排除了付费的推送服务,重点调查了免费的推送服务.   ...

随机推荐

  1. Java Web----EL(表达式语言)详解

     Java Web中的EL(表达式语言)详解 表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容.通过EL可以简化在JSP开发中对对象的引用,从而规范页面 ...

  2. 30分钟Git命令“从入门到放弃”

    git 现在的火爆程度非同一般,它被广泛地用在大型开源项目中,但是初学者非常容易“从入门到放弃”,各种命令各种参数,天哪,宝宝要吓哭了.实际上新手并不需要了解所有命令的用途,学习是需要一个循序渐进的过 ...

  3. 再说rocketmq消息存储

    两篇精彩的文章: <RocketMQ源码 — 三. Producer消息发送过程> <RocketMQ源码解析:Message存储> rocketmq通过netty获取到消息请 ...

  4. Notepad++的使用

    \t 制表符.  \n 新行.  . 匹配任意字符.  | 匹配表达式左边和右边的字符. 例如, "ab|bc" 匹配 "ab" 或者 "bc&quo ...

  5. poj 2236 Wireless Network 【并查集】

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 16832   Accepted: 706 ...

  6. ASP.NET MVC扩展之HtmlHelper辅助方法

    什么是HtmlHelper辅助方法? 其实就是HtmlHelper类的扩展方法,如下所示: namespace System.Web.Mvc.Html { public static class Fo ...

  7. unity3d中布娃娃系统

    原地址:http://blog.csdn.net/pizi0475/article/details/9771941 转自: http://forum.mirax.com.tw/unity/viewto ...

  8. js math 对数和指数处理 expm1 log1p

    1.Math.expm1() Math.expm1(x)返回 ex - 1,即Math.exp(x) - 1. Math.expm1(-1) // -0.6321205588285577 Math.e ...

  9. KVM Run Process之KVM核心流程

    在"KVM Run Process之Qemu核心流程"一文中讲到Qemu通过KVM_RUN调用KVM提供的API发起KVM的启动,从这里进入到了内核空间执行,本文主要讲述内核中KV ...

  10. Com与.Net互操作

    Com与.Net互操作 .Net调用Com组件主要分为两类:静态调用及动态调用.所谓静态调用:指通过tlbimp.exe命名产生Com组件在.Net环境下的包装类,然后通过这个包装类来访问Com组件. ...