UWP-Hintergrundaufgabe HttpClient schlägt fehl, wenn der Gerätebildschirm ausgeschaltet ist

Ich arbeite an einer UWP-App für Handys. Es wurde entwickelt, um Daten mit einem Server zu synchronisieren, der in Ihrem lokalen Heimnetzwerk ausgeführt wird. Diese Synchronisierung kann einige Zeit in Anspruch nehmen, sodass eine Hintergrundaufgabe nicht der beste Ort ist, um die Daten zu synchronisieren. Es wird wahrscheinlich mehr als die 30 Sekunden dauern, die mir zugeteilt wurden. Die Idee ist jedoch, eine Hintergrundaufgabe mit einem Timer-Trigger zu verwenden. Er ruft den Server auf, um zu prüfen, ob Aktualisierungen zu verbrauchen sind, und zeigt dann eine Toast-Benachrichtigung an, in der er gefragt wird, ob er für die Synchronisierung im Vordergrund ausgeführt werden kann.

Der Code funktioniert hervorragend ... wenn der Bildschirm eingeschaltet ist. Wenn der Bildschirm ausgeschaltet ist, erhalte ich keine Benachrichtigungen. Zuerst dachte ich, der Timertrigger würde nicht ausgelöst, aber ich loggte mich ein, wann immer er lief, und zwar alle 15 Minuten pünktlich. Ich habe tiefer hineingeschaut und es scheitert. Insbesondere schlägt dies beim Netzwerkaufruf fehl. HttpClient.GetAsync mit dem folgenden Fehler:

"The text associated with this error code could not be found.\r\n\r\nA connection with the server could not be established\r\n"

Jetzt habe ich den Server überprüft; Es rennt. Ich schalte den Bildschirm ein und der Code funktioniert plötzlich wieder. Ich habe den Trigger so eingestellt, dass er nur ausgeführt wird, wenn eine Verbindung ohne Zähler verfügbar ist:

    var status = await BackgroundExecutionManager.RequestAccessAsync();
    if(status.In(BackgroundAccessStatus.DeniedBySystemPolicy, BackgroundAccessStatus.DeniedByUser))
    {
        return;
    }

    var builder = new BackgroundTaskBuilder();
    builder.Name = Constants.BackgroundTaskName;
    builder.SetTrigger(new TimeTrigger(15, false));
    builder.AddCondition(new SystemCondition(SystemConditionType.FreeNetworkAvailable));
    BackgroundTaskRegistration task = builder.Register();

So würde ichdenke dass der Timer nur ausgelöst wird, wenn das WLAN verfügbar ist. Aber wenn ich dann tatsächlich den HTTP-Abruf durchführe, benutze ich diesen Code:

    async protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
    {
        if (BackgroundWorkCost.CurrentBackgroundWorkCost == BackgroundWorkCostValue.High)
            return;
        if (!NetworkInterface.GetIsNetworkAvailable())
            return;
        base.OnBackgroundActivated(args);
        if (args.TaskInstance.Task.Name == Constants.BackgroundTaskName)
        {
            var cancel = new CancellationTokenSource();
            args.TaskInstance.Canceled += (s, e) =>
            {
                cancel.Cancel();
                cancel.Dispose();
            };
            var deferral = args.TaskInstance.GetDeferral();
            try
            {
                HttpClient client = GetClient();
                var response = await client.GetAsync(ConstructUrl(client.BaseAddress, "updates"), cancel.Token);
                var info = await ParseHttpResponse<UpdateInformation>(response);     
            }
            catch { }
            finally
            {
                deferral.Complete();
            }
        }

Nun, das Lustige ist, NetworkInterface.GetIsNetworkAvailable () gibt "true" zurück und sagt mir, dass ein Netzwerk verfügbar ist. Beim Anruf erhalte ich jedoch die Meldung "Es konnte keine Verbindung zum Server hergestellt werden". Ich habe keine Ahnung, was ich hier falsch mache.

Irgendwelche Ideen

Antworten auf die Frage(4)

Ihre Antwort auf die Frage