2016-04-07 4 views
8

में मूल संदेश टेक्स्ट पर कैसे पहुंचते हैं, मैं के भीतर LuisIntent के रूप में चिह्नित विधि के भीतर से पूर्ण मूल पाठ तक पहुंचने का प्रयास कर रहा हूं।आप Microsoft Bot Framework LuisIntent विधि

IDialogContext context, LuisResult result 

न तो जिनमें से सार्वजनिक रूप से संदेश का मूल पाठ को उजागर करता है:

प्रलेखन दो तर्क लेने के रूप में इन तरीकों को दर्शाता है। संदर्भ वस्तु में संदेश होता है लेकिन एक निजी संपत्ति (context.data.message.text) में जो पहुंच योग्य नहीं है।

क्या context में इसे एक्सेस करने का कोई तरीका है, या इसे संवाद निर्माता में पारित किया जा सकता है?

+0

एक ही सवाल यहाँ क्या कर सकता है,। – fdezjose

उत्तर

5

आप LuisDialog की MessageReceived (...) समारोह ओवरराइड कर सकते हैं के क्षेत्रों रखने संदेश जो आपको सदस्य चर के रूप में चाहिए और अपने इरादे हैंडलर में उन फ़ील्ड तक पहुंचें। नीचे मैं दिखाने के लिए कि कैसे आप आशय संचालकों में से एक में 'message.Text' का उपयोग कर सकते SimpleAlarmDialog संशोधित:

[LuisModel("c413b2ef-382c-45bd-8ff0-f76d60e2a821", "6d0966209c6e4f6b835ce34492f3e6d9")] 
[Serializable] 
public class SimpleAlarmDialog : LuisDialog<object> 
{ 
    private readonly Dictionary<string, Alarm> alarmByWhat = new Dictionary<string, Alarm>(); 

    [Serializable] 
    public class PartialMessage 
    { 
     public string Text { set; get; } 
    } 

    private PartialMessage message; 

    protected override async Task MessageReceived(IDialogContext context, IAwaitable<Message> item) 
    { 
     var msg = await item; 
     this.message = new PartialMessage { Text = msg.Text }; 
     await base.MessageReceived(context, item); 
    } 

    [LuisIntent("builtin.intent.alarm.delete_alarm")] 
    public async Task DeleteAlarm(IDialogContext context, LuisResult result) 
    { 
     await context.PostAsync($"echo: {message.Text}"); 
     Alarm alarm; 
     if (TryFindAlarm(result, out alarm)) 
     { 
      this.alarmByWhat.Remove(alarm.What); 
      await context.PostAsync($"alarm {alarm} deleted"); 
     } 
     else 
     { 
      await context.PostAsync("did not find alarm"); 
     } 

     context.Wait(MessageReceived); 
    } 
} 
+0

भले ही बॉट फ्रेमवर्क का 1.0.2 संस्करण संदेश टेक्स्ट जोड़ता है, फिर भी इसमें नियंत्रक के संदेश ऑब्जेक्ट में शामिल सभी अतिरिक्त जानकारी, वार्तालाप आदि शामिल नहीं है। यह मुझे जो भी अतिरिक्त फ़ील्ड चाहिए, उसे जोड़ने की अनुमति देता है। धन्यवाद! –

+1

हालांकि यह बॉट फ्रेमवर्क के V1 के लिए काम करता है, ऐसा लगता है कि यह V3 के लिए विफल रहता है। यदि आप एसिंक विधि को ओवरराइड करने का प्रयास करते हैं, तो बेस को कॉल करने के लिए यह एक आंतरिक सर्वर त्रुटि देता है। मैसेज रिसीव किया गया। –

1

यदि आप विधि में तोड़ते हैं, तो आप त्वरित घड़ी में देख सकते हैं कि संदर्भ ऑब्जेक्ट में public.data.mesage.Text ("mesage" की गलत वर्तनी) के माध्यम से एक गैर-सार्वजनिक संपत्ति है। के बाद से संपत्ति गैर सरकारी है, तो आप प्रतिबिंब का उपयोग कर इसे प्राप्त करने के लिए से धोखा कर सकता है (How to get the value of private field in C#? में GetInstanceField देख)

 Microsoft.Bot.Builder.Dialogs.Internals.JObjectBotData data = GetInstanceField(typeof (Microsoft.Bot.Builder.Dialogs.Internals.DialogContext), context, "data") as Microsoft.Bot.Builder.Dialogs.Internals.JObjectBotData;    
     Microsoft.Bot.Connector.Message originalMessage = GetInstanceField(typeof(Microsoft.Bot.Builder.Dialogs.Internals.JObjectBotData), data, "mesage") as Microsoft.Bot.Connector.Message; 
     string originalMessageText = originalMessage.Text; 
8

बॉट फ्रेमवर्क के नए संस्करण (1.0.2) के साथ LuisResult वस्तु अब एक है क्वेरी पैरामीटर जिसमें LUIS को भेजी गई मूल क्वेरी शामिल है।

0

आप इसे इस तरह LuisResult की क्वेरी संपत्ति का उपयोग करके

[LuisIntent(intentName: "someIntentName")] 
private async Task Eligibility(IDialogContext context, LuisResult result) 
{ 
    await context.PostAsync($"The original text is: {result.Query}"); 
    context.Wait(MessageReceivedAsync); 
}