2011-03-01 48 views
6

我正在编写一个Windows Phone 7应用程序,它利用推送通知,并有一个类负责管理MS通知服务器和我的服务之间的交互云。但是,当我试图打开我的设备上的通道HttpNotificationChannel正在抛出一个InvalidOperationException与消息“无法打开通道”。根据MSDN我应该尝试再次打开该频道。HttpNotificationChannel打开()抛出InvalidOperationException(“未能打开通道”)

我打开推送通知的代码片段遵循标准模式;

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 Push Recipe部署到我的设备,它也引发相同的异常。

回答

0

@slaad ..这里是我会检查一些东西,除非你已经尝试了这些:

  1. 您的实际设备确实有数据连接,对不对? doh :)
  2. 你如何将现有频道存储在独立存储中?确保你的Find()正在工作&你不想重新创建一个导致异常的通道。
  3. 检查您的频道创建是否存在域名或证书问题。 Try this link
  4. 检查你的每一步对this

对不起,比这个就不是被更多的帮助。

+0

是啊 - 我已经试过我的设备设置为飞行模式,并连接到我的WiFi以确保它不是我的3G数据提供商造成的问题。 – MrMDavidson 2011-03-01 20:21:24

+0

为了澄清,Find()方法是在WP7'HttpNotificationChannel'类中提供的静态方法,我没有明确地进行任何通道存储。此外,这应用程序重新安装后仍然存在,所以不应该有一个挥之不去的通道。我也尝试关闭()该频道,重新启动应用程序,并看看是否有帮助。没有骰子。我正在使用未经认证的频道(即没有涉及证书),所以3出局。在模拟器上,创建过程完美无缺地工作,对#4很怀疑,但会一步一步地再次完成。 – MrMDavidson 2011-03-01 20:28:11

+0

这个问题解决了吗? – curiosity 2011-09-12 09:28:40

6

所以从你的评论我明白,它在你的模拟器上工作,但不是在你的手机上的权利? 您是否有机会在另一个/之前的应用程序中使用频道名称?

事情是,模拟器重置回它的默认状态everyime它关闭,你的手机没有。一个特定的频道名称只能由单个应用程序使用。因此,如果频道名称在其仍被注册到该应用程序之前由同一电话上的其他应用程序使用,并且您无法从您的应用程序访问该频道名称。

相反,应用程序也可以只有一个通道,所以如果有一个与其关联的另一个名称,你不能注册一个新的,直到你注销旧的和重新启动你的设备。也无法请​​求哪个频道与您的应用相关联。

最后当我被困在这个循环中,我改变了通道的名字和我的应用程序的productid登记在WMAppManifest.xml和它的工作再次形成我

<App xmlns="" ProductID="{d57ef66e-f46c-4b48-ac47-22b1e924184b}" 

更新 我的电脑死机这周末,感谢WHS和备份的上帝。 无论如何,下面是我的源代码。我注意到两个区别。

  1. 首先我创建了一个名为RepeatAttemptExecuteMethod(),其余传递整个执行代码作为代表方法。最后浮动的地方是需要重试的次数。如果您每5秒只重试.Open方法,则差异可能是因为我也再次调用Find和New方法...

  2. 我看到的另一个区别是我的代码假定_appChannel.ChannelUri可以为null 。在这种情况下,它会等待频道提出一个事件,然后将该工作与实际频道相关联。但由于你的samplecode没有做任何类型的工作,我怀疑它会是你在找什么

    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(); 
         } 
        } 
    } 
    
+0

@Leon:这是正确的,它可以在模拟器上正常工作。我尝试卸载应用程序的现有版本,重新启动,更改产品ID和频道名称,并重新部署应用程序,但仍遇到同样的问题。当你面临这个问题时,HttpNotificationChannel.Find()返回null?因为对我而言。 – MrMDavidson 2011-03-02 13:05:09

+0

是的。我假设因为实际的频道不再存在,但注册指向它。我可以删除它的唯一方法是删除应用程序,重新启动手机,更改应用程序ID,强制重建它,然后强制重新部署它 – 2011-03-02 15:32:24

+0

Btw不是Microsoft Phone Push Recipe发送通知配方,而不是接收者? – 2011-03-02 15:37:06