2017-05-17 4 views
1

Ich versuche zwischen meiner Host-App und dem Dienst über AppServiceConnection zu kommunizieren. Ich verwende den folgenden Code in meinem Gast App:UWP AppServiceConnection bekommt keinen Wert

using (var connection = new AppServiceConnection()) 
{ 
    connection.AppServiceName = extension.AppServiceName; 
    connection.PackageFamilyName = extension.PackageFamilyName; 

    var connectionStatus = await connection.OpenAsync(); 

    if (connectionStatus == AppServiceConnectionStatus.Success) 
    { 
     var response = await connection.SendMessageAsync(requestMessage); 

     if (response.Status == AppServiceResponseStatus.Success) 
      returnValue = response.Message as ValueSet; 
    } 
} 

Und mein Servicecode:

private async void OnRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args) 
{ 
    var messageDeferral = args.GetDeferral(); 
    var message = args.Request.Message; 
    var returnData = new ValueSet(); 

    var command = message["Command"] as string; 

    switch (command) 
    { 
     case "ACTION": 
      var value = await AsyncAction(); 
      returnData = new ValueSet { { "Value", JsonConvert.SerializeObject(value) } }; 
      break;     
     default: 
      break; 
    } 

    await args.Request.SendResponseAsync(returnData); 
    messageDeferral.Complete(); 
} 

Dieser Teil der Zeit arbeitet, aber auch andere Zeiten die ValueSet (returnValue) ist zufällig leer, wenn der Host empfängt es. Es hat Value drin, wenn es im Dienst zurückgegeben wird, aber wenn ich die Antwort im Host bekomme, nichts.

Ich habe überprüft, dass der Dienst in der Tat den Wert setzt, ihn zur ValueSet hinzufügt und korrekt zurückgibt.

Beachten Sie, dass mein Dienst die Anforderung empfängt, der Host die Antwort empfängt und der Antwortstatus ist Success; Eine fehlgeschlagene Verbindung ist nicht das Problem.

Manchmal geschieht dies nur einmal, bevor die Anfragen wieder funktionieren, zu anderen Zeiten wird es zehn Mal hintereinander passieren.

Die erste funktionierende Antwort nach einem Fehler dauert immer deutlich länger als normal.

Auch habe ich keine Probleme in der Anfrage von Host zu Service. Es ist immer ein Service, wo das Problem auftaucht.

Hat jemand anderes in dieses Problem gerannt und herausgefunden?

+1

Ist es möglich, dass Ihre Verbindung während des Empfangs einer Nachricht entsorgt wird? Ich mag das nicht mit(), ich würde die Verbindung offen halten, bis ich sie nicht sicher brauche. Es wäre auch großartig, wenn Sie ein minimales Beispiel finden und es auf github setzen könnten. –

+0

@AndreyAshikhmin Das Entfernen der Verwendung und das manuelle Entsorgen zur richtigen Zeit ändert nichts für mich. Ich werde versuchen, hier etwas für GitHub zu finden. –

Antwort

3

Bei der Erstellung einer Beispiel-App erkannte ich, was das Problem war. Ich führte eine asynchrone Aktion (wenn auch eine sehr kurze) vor meiner Zeile var messageDeferral = args.GetDeferral(); durch. Es scheint, dass damit die Hintergrundaufgabe geschlossen werden konnte, bevor sie auf den Host geantwortet hatte. Einfach die Zeile an den Anfang der Funktion zu verschieben, behob das Problem für mich.

Also für alle, die auf ein ähnliches Problem stoßen, bekommen Sie Ihren Aufschub, bevor Sie tun irgendetwas sonst! Ersparen Sie sich den Schmerz, den ich durchgemacht habe.