尝试向Azure Notification Hub注册Xamarin App时未经授权的异常

时间:2017-06-06 16:30:47

标签: c# azure xamarin google-cloud-messaging azure-notificationhub

我们正在尝试使用Azure Notification Hub通过GCM / Firebase向Xamarin Forms应用程序发送推送通知。

这是我们用于在PCL中创建MobileServiceClient对象的代码:

public App()
{
    mobileServiceClient = new Microsoft.WindowsAzure.MobileServices.MobileServiceClient("https://namespace.servicebus.windows.net/NotificationHubName", new ModernHttpClient.NativeMessageHandler());
}

据我了解文档,我们不使用自定义HTTP处理程序并不重要,因为我们不需要提供任何额外的标头或类似的东西。我们只想要通知,此时我们不要求Azure提供身份验证(我们使用Azure Active Directory B2C)。我可能错了,因为丢失的身份验证标头显然会导致未经授权的异常。

这是我们用来尝试向Azure Notification Hub注册我们的应用程序的代码:

public async void Register(Microsoft.WindowsAzure.MobileServices.Push push, IEnumerable<string> tags)
{
    try
    {
        const string templateBodyGCM = "{\"data\":{\"message\":\"$(messageParam)\"}}";

        JObject templates = new JObject();
        templates["genericMessage"] = new JObject
        {
            {"body", templateBodyGCM}
        };

        await push.RegisterAsync(RegistrationID, templates);
        Log.Info("Push Installation Id", push.InstallationId.ToString());
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
        Debugger.Break();
    }
}

不幸的是,await push抛出异常.RegisterAsync(RegistrationID,templates):

{Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException: The request could not be completed.  (Unauthorized)

我们成功从GCM收到注册ID,并在尝试向Azure注册我们的应用程序以获取推送通知时获取异常。

不幸的是,大多数有关通知中心的示例使用的旧代码不需要MobileServiceClient构造函数中的第二个参数。代码基于此存储库:https://github.com/xamarin/xamarin-forms-samples/tree/master/WebServices/TodoAzurePush

提前感谢您的帮助!

编辑:测试设备上的日期/时间同步已打开。这显然导致了其他开发人员的类似问题,但这似乎不是问题。

1 个答案:

答案 0 :(得分:1)

  

mobileServiceClient = new Microsoft.WindowsAzure.MobileServices.MobileServiceClient(“https://namespace.servicebus.windows.net/NotificationHubName”,new ModernHttpClient.NativeMessageHandler());

根据您的描述和错误,我发现您已将错误的url参数传递给MobileServiceClient对象。

Microsoft.WindowsAzure.MobileServices.MobileServiceClient的网址是您的移动应用的网址,而不是通知中心网址。

如下所示:

mobileServiceClient = new Microsoft.WindowsAzure.MobileServices.MobileServiceClient("http://yourmobileappname.azurewebsites.net", new ModernHttpClient.NativeMessageHandler());

在移动服务门户中设置与通知中心的连接后,azure移动SDK将自动根据正确的MobileServiceClient获取推送对象。

我建议您还可以检查您是否已连接到移动应用中的通知中心,如下所示:

enter image description here