#c# #logging #botframework
#c# #ведение журнала #botframework
Вопрос:
Я создал бота с помощью Microsoft Boframework C # V4 SDK, и он работает хорошо. Теперь я хочу сохранить сообщения беседы бота и пользователей в базе данных SQL Azure. Как я могу подключиться и зарегистрировать эти сообщения беседы в базе данных SQL Azure.
Я уже пробовал это с SDK V3. В SDK V3 я создал класс SqlActivityLogger и вызвал его из файла Global.asax и открыл там Sql-соединение. И он успешно регистрирует сообщения беседы в базе данных SQL Azure. Теперь, как я могу сделать то же самое в SDK V4 с использованием C #.
SqlActivityLogger.cs
using Microsoft.Bot.Builder.History;
using Microsoft.Bot.Connector;
using System;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Threading.Tasks;
namespace Robo
{
public class SqlActivityLogger : IActivityLogger
{
SqlConnection connection;
public SqlActivityLogger(SqlConnection conn)
{
this.connection = conn;
}
public async Task LogAsync(IActivity activity)
{
string fromId = activity.From.Id;
string toId = activity.Recipient.Id;
string message = activity.AsMessageActivity().Text;
// DateTime DateTimeNow = DateTime.Now;
string insertQuery = "INSERT INTO RobosensusLog(fromId, toId, message) VALUES (@fromId,@toId,@message)";
// Passing the fromId, toId, message to the the user chatlog table
SqlCommand command = new SqlCommand(insertQuery, connection);
command.Parameters.AddWithValue("@fromId", fromId);
command.Parameters.AddWithValue("@toId", toId);
command.Parameters.AddWithValue("@message", message);
// command.Parameters.AddWithValue("@datetime", DateTime.Now);
// Insert to Azure sql database
command.ExecuteNonQuery();
Debug.WriteLine("Insertion successful of message: " activity.AsMessageActivity().Text);
}
}
}
Global.asax
using Autofac;
using Microsoft.Bot.Builder.Dialogs;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Routing;
namespace Robo
{
public class WebApiApplication : System.Web.HttpApplication
{
SqlConnection connection = null;
protected void Application_Start()
{
//Setting up sql string connection
SqlConnectionStringBuilder sqlbuilder = new SqlConnectionStringBuilder();
sqlbuilder.DataSource = "Your data source";
sqlbuilder.UserID = "userid";
sqlbuilder.Password = "password";
sqlbuilder.InitialCatalog = "your catalog";
connection = new SqlConnection(sqlbuilder.ConnectionString);
connection.Open();
Debug.WriteLine("Connection Success");
Conversation.UpdateContainer(builder =>
{
builder.RegisterType<SqlActivityLogger>().AsImplementedInterfaces().InstancePerDependency().WithParameter("conn", connection);
});
GlobalConfiguration.Configure(WebApiConfig.Register);
}
protected void Application_End()
{
connection.Close();
Debug.WriteLine("Connection to database closed");
}
}
}
Комментарии:
1. Не могли бы вы, пожалуйста, поделиться тем, что вы уже пробовали?
2. Я предоставил еще несколько деталей, пожалуйста, взгляните.
Ответ №1:
В Bot Builder V4 ITranscriptLogger заменил IActivityLogger.
Вы можете найти реализацию Entity Framework здесь:https://github.com/BotBuilderCommunity/botbuilder-community-dotnet/pull/78 (Это было только что зафиксировано, поэтому оно еще не было объединено).
Вы можете создать реализацию ITranscriptLogger, которая просто использует System.Data.SqlClient, и сохранять любые поля, которые вы хотите, из действия в LogActivityAsync
После того, как у вас есть реализация ITranscriptLogger, ее можно добавить в стек промежуточного программного обеспечения в Startup.cs с помощью:
var myLogger = new MyTranscriptLogger(Configuration.GetSection("BotDataConnectionString").Value);
var transcriptMiddleware = new TranscriptLoggerMiddleware(myLogger);
options.Middleware.Add(transcriptMiddleware);
Комментарии:
1. не могли бы вы, пожалуйста, поделиться со мной любым проектом, который имеет эту реализацию.