欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Windows Phone 7推送通知服务范例

程序员文章站 2022-04-12 08:52:16
推送服务端代码:   using System; using System.Collections.Generic; using System.Component...

推送服务端代码:
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;

namespace PushNotifications_CloudServer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            byte[] msg = null;
            String type = notificationType.Text;

            switch (type)
            {
                case "Raw":
                    msg = Encoding.UTF8.GetBytes(txtSendMsg.Text);
                    break;
                case "Tile":
                    {
                        string tileMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                                                                    "<wp:Notification xmlns:wp=\"WPNotification\">" +
                                                                      "<wp:Tile>" +
                                                                        "<wp:BackgroundImage>/Images/Cloudy.png</wp:BackgroundImage>" +
                                                                        "<wp:Count>28</wp:Count>" +
                                                                        "<wp:Title>AnthemSord</wp:Title>" +
                                                                      "</wp:Tile>" +
                                                                    "</wp:Notification>";
                        msg = Encoding.UTF8.GetBytes(tileMessage);
                    }
                    break;
                case "Toast":
                    {
                        string toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                                                                  "<wp:Notification xmlns:wp=\"WPNotification\">" +
                                                                    "<wp:Toast>" +
                                                                      "<wp:Text1>AnthemSord:</wp:Text1>" +
                                                                      "<wp:Text2>" + txtSendMsg.Text + "</wp:Text2>" +
                                                                    "</wp:Toast>" +
                                                                  "</wp:Notification>";
                        msg = Encoding.UTF8.GetBytes(toastMessage);
                    }
                    break;
                default:
                    break;
            }

            SendNotifications(msg, type); 
        }


        private void SendNotifications(byte[] strBytes, String type)
        {
            HttpWebRequest sendNotificationRequest = (HttpWebRequest)WebRequest.Create(notificationUriTextBox.Text); //创建请求对象
            sendNotificationRequest.Method = WebRequestMethods.Http.Post;
            sendNotificationRequest.Headers["X-MessageID"] = Guid.NewGuid().ToString();
            sendNotificationRequest.ContentType = "text/xml;charset=utf-8"; 
           
            switch (type)
            {
                case "Raw":
                    {
                        sendNotificationRequest.Headers.Add("X-NotificationClass", "3");
                    }
                    break;
                case "Tile":
                    {
                        sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "token"); 
                        sendNotificationRequest.Headers.Add("X-NotificationClass", "1");
                    }
                    break;
                case "Toast":
                    {
                        sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "toast");
                        sendNotificationRequest.Headers.Add("X-NotificationClass", "2");
                    }
                    break;
                default:
                    break;
            }

            using (Stream stream = sendNotificationRequest.GetRequestStream())
            {
                stream.Write(strBytes, 0, strBytes.Length);
            }

            HttpWebResponse respones = (HttpWebResponse)sendNotificationRequest.GetResponse();
            string notificationStatus = respones.Headers["X-NotificationStatus"];
            string notificationChannelStatus = respones.Headers["X-SubscriptionStatus"];
            string deviceConnectionStatus = respones.Headers["X-DeviceConnectionStatus"];
            msgLabel.Text = string.Format("通知状态: {0}  ,管道状态:{1}  , 设备状态: {2} ,  ",
                notificationStatus, notificationChannelStatus, deviceConnectionStatus);

        }

    }
}
 

WP7 终端代码:
只需要一个启动按钮一个信息接受显示TextBlock
XAML:
 
<phone:PhoneApplicationPage
    x:Class="PushNotifications.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="Demo" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock FontSize="50" x:Name="PageTitle" Text="Push Notification" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Button Content="connect" Height="72" HorizontalAlignment="Left" Margin="6,6,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click" />
            <TextBlock Height="227" HorizontalAlignment="Left" Margin="12,115,0,0" Name="msgtextblock" Text="TextBlock" VerticalAlignment="Top" Width="438" FontSize="28" />
        </Grid>
    </Grid>
</phone:PhoneApplicationPage>
 
 
cs:
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Notification;
using System.Diagnostics;
using System.IO;

namespace PushNotifications
{
    public partial class MainPage : PhoneApplicationPage
    {
        private HttpNotificationChannel httpChannel;
        private const string channelName = "Channel1";

        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            httpChannel = HttpNotificationChannel.Find(channelName);
            if (httpChannel != null)
            {
                httpChannel.Close();
                httpChannel.Dispose();
            }

            //create the channel;
            httpChannel = new HttpNotificationChannel(channelName, "NotificationService");

            httpChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(httpChannel_ChannelUriUpdated);

            httpChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(httpChannel_ErrorOccurred);

            httpChannel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(httpChannel_HttpNotificationReceived);

            httpChannel.Open();

        }
        /// <summary>
        /// 收到讯息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void httpChannel_HttpNotificationReceived(object sender, HttpNotificationEventArgs e)
        {
            using (var reader = new StreamReader(e.Notification.Body))
            {
                string msg = reader.ReadToEnd();
                Dispatcher.BeginInvoke(() => {
                    msgtextblock.Text = msg;
                });
            }
        }
        /// <summary>
        /// 显示错误
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void httpChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
        {
            Dispatcher.BeginInvoke(() => {
                msgtextblock.Text = e.Message;
            });
        }
        /// <summary>
        /// 获取uri
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void httpChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
        {
            Debug.WriteLine("Channel Uri:{0}", e.ChannelUri);
        }

    }
}





摘自 据说名字长的都是高手