2017-08-24 10 views
0

MessagesController.cs私のコードでは、ユーザーID、ユーザー名、チャンネル、日付​​、メッセージなどのユーザーログデータを保存するための部品を追加しました。しかし、私はどのように行うのか分からない。データベースは紺色です。質問と回答のようなボットフレームデータを保存するにはどうすればいいですか

これはコードです: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、作成したメッセージを保存することができますが、レスポンスは返されません(すべてのテストでnullの応答)。

私は何ができるのですか?

答えて

1

ここに行く方法の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}"); 
     } 
    } 

また、メッセージがボットからのものであることを知るという問題を打つかもしれません。その場合は、Know if IActivity is from bot or user in IActivityLoggerとお読みください。

+0

このデータはどこに保存されていますか?データベースに? – user38

+0

これはあなたのユースケースに依存しますが、はいはどこにでも保存できます。 –

+0

@Ezequiuel私はボットの反応も保存したいと思っています...ユーザーが何を書いているのかだけでなく、 – user38

関連する問題