我正在编写一个使用推送通知的Windows Phone 7应用程序,并且有一个类负责管理MS Notification Server与我在云中的服务之间的交互。但是,当我试图在我的设备上打开频道时,HttpNotificationChannel会抛出InvalidOperationException,并显示消息“无法打开频道”。根据{{3}}我应该尝试再次打开频道。
我打开推送通知的代码段遵循标准模式;
public class HttpNotification {
private const string kChannelName = "MyApp.PushNotification";
private HttpNotificationChannel _Channel;
public void Register() {
try {
_Channel = HttpNotificationChannel.Find(kChannelName);
if (_Channel == null) {
_Channel = new HttpNotificationChannel(kChannelName);
InstallEventHandlers();
// This line throws
_Channel.Open();
} else {
InstallEventHandlers();
};
} catch (InvalidOperationException ex) {
MessageBox.Show(string.Format("Failed to initialise Push Notifications - {0}", ex.Message));
};
}
}
我不确定MSDN的含义是“尝试再次打开频道”。我已经在try / catch中调用了Open()并在两次尝试之间打盹了5秒,但是没有成功。我也尝试了整个方法的相同方法(即,每次抛出时调用HttpNotificationChannel.Find())都无济于事。
我知道这有点模糊 - 但是想知道是否有人对此有任何建议?这个相同的代码在模拟器中完美运行,但每次在我的实际设备上都失败,即使在我的应用程序卸载并重新安装之后也是如此。鉴于这是我的实际手机,我有点保持沉默,希望能解决这个问题,并且不愿意将此应用程序发布到市场,因为这个问题困扰着我。
更新:另外一点,我使用的是未经身份验证的频道,因此我的基于云的服务没有安装证书。
更新#2:此外,我刚尝试将Microsoft Phone推送配方部署到我的设备上,它也会抛出相同的异常。
答案 0 :(得分:6)
因此,根据您的评论,我了解它可以在您的模拟器上运行但不能在您的手机上运行吗? 你有没有机会在另一个/之前的申请中使用频道名称?
问题是模拟器重置回它的默认状态,它关闭,你的手机没有。特定通道名称只能由单个应用程序使用。因此,如果频道名称在同一部手机上被另一个应用程序使用,那么它仍然会注册到该应用程序,并且您无法通过应用程序访问它。
相反,一个应用程序也可以注册不超过一个频道,因此,如果已经有一个与其相关联的名称,那么在取消注册旧频道并重新启动设备之前,您无法注册新频道。此外,无法请求将哪个频道与您的应用相关联。
最终当我陷入这个循环时,我改变了频道的名称,并在WMAppManifest.xml中注册了我的应用程序ProductID,它再次起作用了我
<App xmlns="" ProductID="{d57ef66e-f46c-4b48-ac47-22b1e924184b}"
<强>更新强> 我的电脑本周末崩溃,感谢上帝的WHS和备份。 无论如何下面是我的源代码。我注意到两个不同之处。
首先,我创建了一个名为RepeatAttemptExecuteMethod()
的方法,我将整个执行代码作为委托传递给它。最后浮动的10个是它必须重试的次数。如果你每5秒只重试.Open
方法,差异可能在于我也再次调用Find和New方法......
我看到的另一个区别是我的代码假定_appChannel.ChannelUri可以为null。在这种情况下,它等待通道引发事件,然后将工作与实际通道相关联。但是,由于您的样本代码没有做任何类似的工作,我怀疑它将是您正在寻找的
protected override void Load(PhoneApplicationPage parent)
{
Verkeer.Helper.ExternalResources.RepeatAttemptExecuteMethod(() =>
{
_appChannel = HttpNotificationChannel.Find(CHANNELNAME);
if (_appChannel == null)
{
_appChannel = new HttpNotificationChannel(CHANNELNAME);
SetUpDelegates();
}
else
{
SetUpDelegates();
//if (_appChannel.ChannelUri != null) this.NotificationChannel = _appChannel.ChannelUri;
}
if (_appChannel.ChannelUri != null) this.NotificationChannel = _appChannel.ChannelUri;
else
{
try
{
_appChannel.Open();
}
catch { }
}
BindToShellTile();
App.ViewModel.TrafficInfo.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(TrafficInfo_PropertyChanged);
if (App.ViewModel.TrafficInfo.TrafficImage != null && this.NotificationChannel != null)
{
CreateTiles();
}
},10);
}
private void BindToShellTile()
{
if (!_appChannel.IsShellTileBound && App.ViewModel.PanItemSettings.AutomaticallyUpdateTile)
{
Collection<Uri> ListOfAllowedDomains = new Collection<Uri> { new Uri("http://m.anwb.nl/") };
_appChannel.BindToShellTile(ListOfAllowedDomains);
}
}
void TrafficInfo_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "TrafficImage")
{
if (App.ViewModel.PanItemSettings.AutomaticallyUpdateTile && this.NotificationChannel != null)
{
CreateTiles();
}
}
}
答案 1 :(得分:0)
@slaad ..除非你已经尝试过,否则我会检查一些事情:
对不起,没有比这更多的帮助了。