6

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

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

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 的“尝试再次打开频道”到底是什么意思。我已经将对 Open() 的调用包装在 try/catch 中,并在两次尝试之间打盹 5 秒,但它没有成功。我还在整个方法周围尝试了相同的方法(即每次抛出时都调用 HttpNotificationChannel.Find() )但无济于事。

我知道这有点含糊 - 但想知道是否有人对处理这个有任何建议?相同的代码在模拟器中完美运行,但每次在我的实际设备上都失败,即使在卸载并重新安装我的应用程序之后也是如此。鉴于这是我的实际手机,我有点不愿意进行硬件重置,希望它能解决这个问题,并且在这个问题困扰着我的情况下将应用程序发布到市场上感到不舒服。

更新:另外一点,我使用的是未经身份验证的通道,因此没有为我的基于云的服务安装证书。

更新 #2:此外,我刚刚尝试将 Microsoft Phone Push Recipe 部署到我的设备,它也抛出了相同的异常。

4

2 回答 2

6

因此,从您的评论中,我了解到它确实可以在您的模拟器上运行,但不能在您的手机上运行,​​对吗?您是否曾在另一个/先前的应用程序中使用过频道名称?

问题是模拟器每次关闭时都会重置回默认状态,而您的手机不会。特定通道名称只能由单个应用程序使用。因此,如果频道名称在同一手机上的另一个应用程序仍然注册到该应用程序之前已被其他应用程序使用,并且您无法从您的应用程序访问它。

相反,一个应用程序也可以注册不超过一个频道,因此如果已经有一个与之关联的另一个名称,则在取消注册旧频道并重新启动设备之前,您无法注册新频道。此外,无法请求与您的应用关联的频道。

最终,当我陷入这个循环时,我更改了频道的名称,并在 WMAppManifest.xml 中注册了我的应用程序 ProductID,它再次对我起作用

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

更新 我的电脑这个周末崩溃了,感谢上帝的 WHS 和备份。无论如何,下面是我的源代码。我注意到两个不同之处。

  1. 首先,我创建了一个调用方法RepeatAttemptExecuteMethod(),将整个执行代码作为委托传递给该方法。最后浮动的 10 是它必须重试的次数。如果您仅.Open每 5 秒重试一次该方法,则不同之处可能在于我还再次调用 Find 和 New 方法...

  2. 我看到的另一个区别是我的代码假定 _appChannel.ChannelUri 可以为空。在这种情况下,它会等待通道引发事件,然后执行与存在的实际通道相关的工作。但是由于您的示例代码没有做任何此类工作,我怀疑它会是您正在寻找的

    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();
            }
        }
    }
    
于 2011-03-02T09:29:49.930 回答
0

@slaad .. 这里有几件事我会检查,除非你已经尝试过这些:

  1. 您的实际设备确实具有数据连接,对吗?多哈:)
  2. 您如何将现有通道存储在独立存储中?确保您的 Find() 正在工作并且您没有尝试重新创建存在导致异常的通道。
  3. 检查您的频道创建是否存在域名或证书问题。试试这个链接
  4. 对照此检查流程的每一步

对不起,没有比这更多的帮助。

于 2011-03-01T14:07:10.820 回答