Как я могу сохранить данные бот-фреймворка, такие как вопросы и ответы

В MessagesController.cs в своем коде я добавил часть для сохранения данных журнала пользователя, таких как идентификатор пользователя, имя пользователя, канал, дата, сообщения... Я хочу также сохранить ответ бота? но я не знаю как это сделать. База данных на лазурном.

Это код: MessagesController.cs

    using System.Net.Http;
   using System.Threading.Tasks;
     using System.Web.Http;
  using Microsoft.Bot.Builder.Dialogs;
 using Microsoft.Bot.Connector;
 using System;
 using System.Net;

 namespace QnABot
 {
[BotAuthentication]
public class MessagesController : ApiController
{
    /// <summary>
    /// POST: api/Messages
    /// Receive a message from a user and reply to it
    /// </summary>
    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {

        #region Set CurrentBaseURL and ChannelAccount
        // Get the base URL that this service is running at
        // This is used to show images
        string CurrentBaseURL =

     this.Url.Request.RequestUri.AbsoluteUri.Replace(@"api/messages", "");

        // Create an instance of BotData to store data
        BotData objBotData = new BotData();

        // Instantiate a StateClient to save BotData            
        StateClient stateClient = activity.GetStateClient();

        // Use stateClient to get current userData
        BotData userData = await stateClient.BotState.GetUserDataAsync(
            activity.ChannelId, activity.From.Id);

        // Update userData by setting CurrentBaseURL and Recipient
        userData.SetProperty<string>("CurrentBaseURL", CurrentBaseURL);

        // Save changes to userData
        await stateClient.BotState.SetUserDataAsync(
            activity.ChannelId, activity.From.Id, userData);
        #endregion

        if (activity.Type == ActivityTypes.Message)
        {



            //*************************
            //Log to Database
            // *************************

            //// Instantiate the BotData dbContext
            Model.qnamakerentitiesEntities DB = new 
           Model.qnamakerentitiesEntities();
            // Create a new UserLog object
            Model.UserLog NewUserLog = new Model.UserLog();

            // Set the properties on the UserLog object
            NewUserLog.Channel = activity.ChannelId;
            NewUserLog.UserID = activity.From.Id;
            NewUserLog.UserName = activity.From.Name;
            NewUserLog.created = DateTime.UtcNow;
            NewUserLog.Message = activity.Text.Truncate(500);
            //   NewUserLog.Response = activity.AsMessageActivity()?.Text;



            // Add the UserLog object to UserLogs
            DB.UserLogs.Add(NewUserLog);
            // Save the changes to the database
            DB.SaveChanges();


            await Conversation.SendAsync(activity, () => new 
        Dialogs.QnADialog());
        }
        else
        {
            await HandleSystemMessage(activity);
        }
        var response = Request.CreateResponse(HttpStatusCode.OK);
        return response;
    }

    private async Task<Activity> HandleSystemMessage(Activity message)
    {
        if (message.Type == ActivityTypes.DeleteUserData)
        {
            // Implement user deletion here
            // If we handle user deletion, return a real message
        }
        else if (message.Type == ActivityTypes.ConversationUpdate)
        {
            IConversationUpdateActivity iConversationUpdated = message as 
       IConversationUpdateActivity;
            if (iConversationUpdated != null)
            {
            }
        }
        else if (message.Type == ActivityTypes.ContactRelationUpdate)
        {
            // Handle add/remove from contact lists
            // Activity.From + Activity.Action represent what happened
        }
        else if (message.Type == ActivityTypes.Typing)
        {
            // Handle knowing tha the user is typing
        }
        else if (message.Type == ActivityTypes.Ping)
        {
        }

        return null;
         }
       }
     }

RootDialog.cs выглядит так:

  using System;
  using System.Threading.Tasks;
  using Microsoft.Bot.Builder.Dialogs;
  using Microsoft.Bot.Connector;
  using QnABot.API;
  using Microsoft.Bot.Builder.Dialogs.Internals;

  namespace QnABot.Dialogs
  {
  [Serializable]
  public class RootDialog : IDialog<object>
   {
    public Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);

        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, 
     IAwaitable<object> result)
    {
        //var activity = await result as Activity;

        //// Prompt text
        //await context.PostAsync("Welcome Feel free to ask me ");

        //var privateData = context.PrivateConversationData;
        //var privateConversationInfo = IncrementInfoCount(privateData, 
   BotStoreType.BotPrivateConversationData.ToString());
        //var conversationData = context.ConversationData;
        //var conversationInfo = IncrementInfoCount(conversationData, 
   BotStoreType.BotConversationData.ToString());
        //var userData = context.UserData;
        //var userInfo = IncrementInfoCount(userData, 
     BotStoreType.BotUserData.ToString());
        //context.Wait(QnADialog);



  //privateData.SetValue(BotStoreType.BotPrivateConversationData.ToString(), 
      privateConversationInfo);

   //conversationData.SetValue(BotStoreType.BotConversationData.ToString(), conversationInfo);
        //userData.SetValue(BotStoreType.BotUserData.ToString(), userInfo);
        Activity replyToConversation = (Activity)context.MakeMessage();
        replyToConversation.Recipient = replyToConversation.Recipient;
        replyToConversation.Type = "message";
    }

    private async Task QnADialog(IDialogContext context, IAwaitable<object> 
    result)
    {
        var activityResult = await result as Activity;
        var query = activityResult.Text;
        var reply = activityResult.CreateReply();

        var qnaResult = QnaApi.GetFirstQnaAnswer(query);
        string message = "";

        if (qnaResult == null)
        {
             message = $"Sorry, I did not understand . Please reformulate 
        your question";

        }
        else
        {
            message = qnaResult.answers[0].answer;
        }



        // *************************
        // Log to Database
        // *************************
        Activity replyToConversation = (Activity)context.MakeMessage();
        // Instantiate the BotData dbContext
        Model.qnamakerentitiesEntities DB = new 
        Model.qnamakerentitiesEntities();
        // Create a new UserLog object
        Model.UserLog NewUserLog = new Model.UserLog();

        // Set the properties on the UserLog object
        NewUserLog.Channel = replyToConversation.ChannelId;
        NewUserLog.UserID = replyToConversation.From.Id;
        NewUserLog.UserName = replyToConversation.From.Name;
        NewUserLog.created = DateTime.UtcNow;
        // This logs the message being sent to the user
        NewUserLog.Message = qnaResult.answers[0].answer;
        //  NewUserLog.Response= qnaResult.answers[0].answer;

        // Add the UserLog object to UserLogs
        DB.UserLogs.Add(NewUserLog);
        // Save the changes to the database
        DB.SaveChanges();

        await context.PostAsync(replyToConversation);
        context.Wait(MessageReceivedAsync);
    }
    public class BotDataInfo
    {
        public int Count { get; set; }
    }

    private BotDataInfo IncrementInfoCount(IBotDataBag botdata, string key)
    {
        BotDataInfo info = null;
        if (botdata.ContainsKey(key))
        {
            info = botdata.GetValue<BotDataInfo>(key);
            info.Count++;
        }
        else
            info = new BotDataInfo() { Count = 1 };

        return info;
    }
}
}

Я пытался следовать вашим инструкциям, но все еще есть проблемы. Я могу сохранить в базе данных Id, UserId, ChannelID, созданный, сообщение, но не ответ (нулевой ответ во всех моих тестах) .

Можете ли вы помочь мне, что я могу сделать?

1 ответ

Одним из способов достижения этой цели является реализация IActivityLogger проверять входящие и исходящие сообщения. В примере core-Middleware вы увидите пример того, как это сделать.

public class DebugActivityLogger : IActivityLogger
    {
        public async Task LogAsync(IActivity activity)
        {
            Debug.WriteLine($"From:{activity.From.Id} - To:{activity.Recipient.Id} - Message:{activity.AsMessageActivity()?.Text}");
        }
    }

Кроме того, вы можете решить вопрос о том, когда сообщение отправлено ботом. В этом случае я рекомендую вам прочитать, если IActivity принадлежит боту или пользователю в IActivityLogger.

Другие вопросы по тегам