发送从Windows Phone设备到webservice的推送通知
我对Windows Phone 7设备的推送通知服务有疑问: 我现在可以发送推送通知,使用Web应用程序到电话,更改数据的瓷砖。但问题是:当我启动应用程序时,我需要在调试器输出中显示URI,然后将其复制粘贴到Web应用程序中,然后将该MPNS与适用于更新的MPNS联系一次一个电话。但我想创建一个可以自动进行多个调用的Web服务,检索应用程序的URI(在关闭并打开应用程序后发生更改,我认为),并向其发送推送通知。但我还没有找到一个MSDN主题来处理这个问题。他们只是使用赞扬,说:“以后需要用URI来替换。”所以我的问题是:如何使用手机将这样的消息发送给web服务,对其进行响应,然后再次连接到手机,处理此类请求? 还有:我是否需要经过身份验证的Web服务,还是有调试版本?发送从Windows Phone设备到webservice的推送通知
这是我迄今:
/// <summary>
/// Setup a connection with a webservice, in order to update a shell, either a toast- or a tile shell.
/// </summary>
/// <param name="shellType">The type of shell you wish to update</param>
public void SetupShellChannel (ShellBindType shellType)
{
//holds the push notification that is created. Since we can only have one notification channel open at any one time,
//we will need to check for existance. That is why, the channelName shouldn't be changed
HttpNotificationChannel _httpChannel = HttpNotificationChannel.Find(_channelName);
//if the _httpChannel was not found (read: does not exist)
if (_httpChannel == null)
{
_httpChannel = new HttpNotificationChannel(_channelName );
_httpChannel.Open();
//because there is more than one shelltype we can open, we will use a switch to call the method we seek
BindToShell(_httpChannel, shellType);
}
//Only one push notification service is allowed per application, so we cannot send a tile notification, as well as
//a toast message notification. When we attempt this, we get a InvalidOperationException
else
{
//in this case, the _httpChannel did already exist, but the problem is, we cannot just add the eventHandlers,
//because there is the danger that it didn't exist, and we would get a null pointer exception.
//_httpChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(httpChannel_ChannelUriUpdated);
//_httpChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(httpChannel_ErrorOccurred);
//For testing purposes, we now display the URI to the user, and as output. Normally, we would pass this URI back to the webserver
System.Diagnostics.Debug.WriteLine(_httpChannel.ChannelUri.ToString());
}
//if (_httpChannel.ChannelUri)
//When the URI is updated, we want this to be sent to the server as well, so we know that the adress has changed,
//and don't just send data somewhere into the void. Also, when encountering an error, we want to show the user when
//an error has occured.
_httpChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(HttpChannel_ChannelUriUpdated);
_httpChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(HttpChannel_ErrorOccurred);
}
//here, also we would return the URI to the server, but for debugging purposes, we display them to the user.
void HttpChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
{
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
System.Diagnostics.Debug.WriteLine(e.ChannelUri.ToString());
MessageBox.Show(String.Format("the URI is {0}", e.ChannelUri.ToString()));
});
}
private void BindToShell(HttpNotificationChannel channel, ShellBindType shellType)
{
switch (shellType)
{
case ShellBindType.BindToShellTile:
channel.BindToShellTile();
break;
case ShellBindType.BindToShellToast:
channel.BindToShellToast();
break;
}
}
void HttpChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
{
//getting an error would be caugth here, and then displayed to the user.
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
MessageBox.Show(String.Format("A push notification {0} error occured. {1}{(2)}{3}",
e.ErrorType, e.Message, e.ErrorCode, e.ErrorAdditionalData));
});
}
好吧,我明白你的问题。我所做的一切就是一旦我从MPNS获得URI,我就以此为参数调用服务的Web方法 - 订阅(int subscriberId,Uri channelUri);
因此,您需要确保在应用中生成subscriberId以识别用户并将其存储在独立存储中。这可以是一个GUID。
该责任现在在hte服务器上将用户保存到Uri映射到持久存储中。
此外,您还需要提供UnSubscribe方法供用户选择退出推送通知。这是推送通知的认证要求之一。
现在谈谈你的第二个问题 - 是的,你需要确保你的服务 - 你不想处理未知的请求。
我个人做什么,将它分成2个服务 - 发布服务和订阅服务。发布服务将发送hte通知,而订阅将具有订阅/取消订阅方法。
我想你想问你可以发送推送通知从Windows Phone本身或不使用任何其他服务器端的ASP/PHP像MSDN中的示例应用程序中所述。是。您可以从手机/设备本身发送通知。您必须更改MSDN中给出的Sample应用程序的Send函数。如果您有任何疑问,请回复。
static async Task<string> SendPushNotification(string textToSend)
{
//You can maintain a DB to query different channel URIs of devices
string subscriptionUri = "<Uri To Which You Want Send Notification>";
HttpWebRequest sendNotificationRequest = (HttpWebRequest)WebRequest.Create(subscriptionUri);
sendNotificationRequest.Method = "POST";
string toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<wp:Notification xmlns:wp=\"WPNotification\">" +
"<wp:Toast>" +
"<wp:Text1>" + textToSend + "</wp:Text1>" +
"<wp:Param>/NotificationDetails.xaml?Message=" + textToSend + "</wp:Param>" +
"</wp:Toast> " +
"</wp:Notification>";
byte[] notificationMessage = Encoding.UTF8.GetBytes(toastMessage);
sendNotificationRequest.ContentLength = notificationMessage.Length;
sendNotificationRequest.ContentType = "text/xml";
sendNotificationRequest.Headers["X-WindowsPhone-Target"] = "toast";
sendNotificationRequest.Headers["X-NotificationClass"] = "2";
using (var requestStream = await Task.Factory.FromAsync<Stream>(sendNotificationRequest.BeginGetRequestStream, sendNotificationRequest.EndGetRequestStream, null))
{
requestStream.Write(notificationMessage, 0, notificationMessage.Length);
}
string notificationStatus;
using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(sendNotificationRequest.BeginGetResponse, sendNotificationRequest.EndGetResponse, null)))
{
//StreamReader reader = new StreamReader(response.GetResponseStream());
//result = reader.ReadToEnd();
notificationStatus = response.Headers["X-NotificationStatus"];
MessageBox.Show(notificationStatus);
}
return notificationStatus;
}
这适用于Windows/Windows Phone 8.1吗? – 2015-09-15 09:43:11
您能否解释qn的第一部分 - 如何使用手机向web服务发送此类消息,作出响应并再次连接到手机,以处理此类请求。 – whihathac 2012-02-07 21:43:56