wp wp8:服务器推送

前提:必须使用真机,真机注册

服务器端使用的是winform做的

客户端wp8系统 nokia920

client代码:

图:


注意一定要在wmappmanifest.xml中勾选 pushnotifiation 图:


上代码:

MainPage.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using push_client.Resources;
using Microsoft.Phone.Notification;

namespace push_client
{
public partial class MainPage : PhoneApplicationPage
{

// 构造函数
public MainPage()
{
HttpNotificationChannel myChannel = null;
// 推送信道的名字,随便取一个就行了
string ChannelName = "ToastChannel";
InitializeComponent();
// Find静态方法可以根据名字查找信道
myChannel = HttpNotificationChannel.Find(ChannelName);
// 如果找不到,就要创建一个了
if (myChannel == null)
{
myChannel = new HttpNotificationChannel(ChannelName);
// 注册事件
myChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(myChannel_ChannelUriUpdated);
myChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(myChannel_ErrorOccurred);
myChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(myChannel_ShellToastNotificationReceived);
// 打开信道
myChannel.Open();
// 绑定Toast通知,这样在程序不在前台时才会显示
// 屏幕上方的通知提示条
myChannel.BindToShellToast();
}
else
{
// 如果存在,还要注册一次事件,因为在程序被扔到后台后可能会删除事件绑定
myChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(myChannel_ChannelUriUpdated);
myChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(myChannel_ErrorOccurred);
myChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(myChannel_ShellToastNotificationReceived);

// 在“输出”窗输出URL,因为我们只是测试,这样一来方便一点
System.Diagnostics.Debug.WriteLine("通道URI为:{0}", myChannel.ChannelUri.ToString());
}
}

void myChannel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
{
string msg = "";
foreach (string key in e.Collection.Keys)
{
msg += key + " : " + e.Collection[key] + "\r\n";
}
Dispatcher.BeginInvoke(() =>
{
//this.txtInfo.Text = msg;
System.Diagnostics.Debug.WriteLine(msg);
});
}

void myChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
{
//Dispatcher.BeginInvoke(() => MessageBox.Show(e.Message));
System.Diagnostics.Debug.WriteLine(e.Message);
}

void myChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
{
// 当URL发生改变后,还要输出一次
// 保证我们得到的是最新版本的URI
Dispatcher.BeginInvoke(() =>
{

//服务器端要用到的uri
System.Diagnostics.Debug.WriteLine("通道URI:{0}", e.ChannelUri.ToString());
});
}

// 这个方法不用我多介绍了
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (NavigationContext.QueryString.ContainsKey("toastmsg"))
{
//this.txtInfo.Text = NavigationContext.QueryString["toastmsg"];
}
}

}
}


ReceiveMessagePage.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;

namespace push_client
{
public partial class ReceiveMessagePage : PhoneApplicationPage
{
public ReceiveMessagePage()
{
InitializeComponent();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{

try
{
string t1String = "";

if (NavigationContext.QueryString.TryGetValue("tp1", out t1String))
{
t1.Text = t1String;

}

string t2String = "";

if (NavigationContext.QueryString.TryGetValue("tp2", out t2String))
{
t2.Text = t2String;

}
}
catch (Exception)
{

}

}

}
}

服务器端代码:

图:


上代码:

Form1.Designer.cs

using System;
using System.Windows.Forms;
namespace push_service
{
partial class Form1
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows 窗体设计器生成的代码


TextBox txtResult;

TextBox txtValue1;
TextBox txtValue2;

private void InitializeComponent()
{
this.SuspendLayout();
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(284, 261);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
this.Width = 800;

Button button = new Button();
button.Width = 80;
button.Height = 30;
button.Left = 340;
button.Top = 30;
button.Text = "执 行";
button.Click += new EventHandler(btnSend_Click);
this.Controls.Add(button);

txtValue1 = new TextBox();
txtValue1.Text = "显示在toast中的参数1";
txtValue1.Left = 10;
txtValue1.Top = 10;
txtValue1.Width = 300;
txtValue1.Height = 50;
this.Controls.Add(txtValue1);

txtValue2 = new TextBox();
txtValue2.Text = "显示在toast中的参数2";
txtValue2.Left = 10;
txtValue2.Top = 60;
txtValue2.Width = 300;
txtValue2.Height = 50;
this.Controls.Add(txtValue2);

txtResult = new TextBox();
txtResult.Left = 10;
txtResult.Top = 120;
txtResult.Width = 300;
txtResult.Height = 50;
this.Controls.Add(txtResult);

}

#endregion
}
}

Form1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace push_service
{
public partial class Form1 : Form
{



public Form1()
{
InitializeComponent();

}

private void btnSend_Click(object sender, EventArgs e)
{
//uri是客户端 在注册之后 运行在真机上得到的uri
string URI = "http://db3.notify.live.net/throttledthirdparty/*************************";
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URI);
myRequest.ContentType = "text/xml";
myRequest.Headers.Add("X-WindowsPhone-Target", "toast");

/*
* X-NotificationClass 处理间隔
* 2 - 立即发送
* 12 - 450秒内发送
* 22 - 900秒内发送
*/
myRequest.Headers.Add("X-NotificationClass", "2");

// 要发送的内容
//注意:Param中&要转义为&
string toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<wp:Notification xmlns:wp=\"WPNotification\">" +
"<wp:Toast>" +
"<wp:Text1>" + txtValue1.Text + "</wp:Text1>" +
"<wp:Text2>" + txtValue2.Text + "</wp:Text2>" +
"<wp:Param>" + "/ReceiveMessagePage.xaml?tp1=" + "11" + "&tp2=" + "22"
+ "</wp:Param>" +
"</wp:Toast>" +
"</wp:Notification>";

byte[] buffer = Encoding.UTF8.GetBytes(toastMessage);
myRequest.ContentLength = buffer.Length;
myRequest.Method = "POST";

using (System.IO.Stream stream = myRequest.GetRequestStream())
{
stream.Write(buffer, 0, buffer.Length);
}

// 接收回应
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();

string headers = "";
foreach (var hd in myResponse.Headers.AllKeys)
{
headers += hd + " : " + myResponse.Headers[hd] + " | ";
}
headers += "\r\n";
string msg = "";
using (System.IO.Stream recStream = myResponse.GetResponseStream())
{
System.IO.StreamReader reader = new System.IO.StreamReader(recStream, Encoding.UTF8);
msg = reader.ReadToEnd();
reader.Close();
}
msg += "\r\n\r\n";
txtResult.AppendText(headers + msg);
}

private void Form1_Load(object sender, EventArgs e)
{

}
}
}

服务器端运行效果:


客户端接受效果:
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值