Microsoft Bot Work: Unntak: Dataene er endret

stemmer
2

Jeg har en bot med følgende samtale scenario:

  1. Send tekst til LUIS
  2. LUIS hensikt kaller context.Call(...)å lansere en Dialog
  3. Dette dialog opphører, spare litt info i Userdata:

    private static async Task storeBotData(IDialogContext context, BotData userData) { Activity activity = (Activity)context.Activity; StateClient sc = activity.GetStateClient(); await sc.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData); }

    Og etter det ringe en annen dialog, igjen med context.Call(...).

  4. Da de siste dialog går og avsluttes.

Mitt problem er at når du oppdaterer brukerdataene på slutten av den første dialogen (trinn 3), har jeg følgende unntak i Bot Work Channel Emulator:

         `Exception: The data is changed [File of type 'text/plain']`...

Hva skjer her ? Jeg tror at når en dialog opphører, det kaller setUserDataseg selv, men jeg forstår ikke hvorfor jeg ikke kan oppdatere brukerdata hvor som helst i koden ...

Jeg har prøvd å fange unntaket, men ingenting er forkjølet .. Men jeg vet at brukerdata er oppdatert, fordi når jeg prøver å hente den tilbake, det er oppdatert ...

Alle hjelpe er velkommen :)

Takk

Publisert på 17/03/2017 klokken 14:24
kilden bruker
På andre språk...                            


2 svar

stemmer
4

Botframework gjenoppretter / sparer staten samtale etter hver handling av aktivitet, så under dyna typisk flyt ser ut som følgende:

[23:15:40] <- GET 200 getUserData 
[23:15:47] <- GET 200 getConversationData 
[23:15:47] <- GET 200 getPrivateConversationData 
...
[23:16:42] <- POST 200 setConversationData 
[23:16:42] <- POST 200 setUserData 
[23:16:42] <- POST 200 setPrivateConversationData 

Som det er nevnt her : These botData objects will fail to be stored if another instance of your bot has changed the object already.Så i ditt tilfelle unntak oppstår ved avslutning av dialogen, når rammene kaller setUserData av seg selv og finner ut at BotData er endret allerede (etter din eksplisitt kall BotState.SetUserDataAsync). Jeg antar det er grunnen til at du ikke var i stand til å fange unntaket.

Løsning: Jeg brukte følgende kode, og det fikset problemet:

private static void storeBotData(IDialogContext context, BotData userData)
{
        var data = context.UserData;
        data.SetValue("field_name", false);            
}

Grunnen til at det fungerer er at vi endrer gjenstand for Userdata men tillater botFramework å "begå" det selv, så det er ingen konflikt

Svarte 20/03/2017 kl. 20:35
kilden bruker

stemmer
1

Jeg er enig med @Artem (dette løste mitt problem også, takk!). Jeg ville bare legge til følgende retningslinje.

Bruk

var data = context.UserData;
data.SetValue("field_name", false);

når du har en IDialogContext objekt tilgjengelig, så du lar Bot Work forplikte endringer.

Bruk i stedet

StateClient sc = activity.GetStateClient();
await sc.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);

når du ikke har en IDialogContext objekt, for eksempel i MessageController klassen.

Svarte 23/08/2017 kl. 12:11
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more