多租户机器人数据存储
Multi-tenant bot data store
我一直在用 C# 为多租户 azure 机器人实现以下功能,这非常适合验证应用凭据。
但是,我想知道机器人数据存储是否也可以这样做?
我目前有标准的 Azure Table 存储机器人数据存储,它使用 web.config:
中定义的单个连接字符串
Conversation.UpdateContainer(
builder =>
{
builder.RegisterModule(new ReflectionSurrogateModule());
builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly()));
//var store = new InMemoryDataStore();
var store = new TableBotDataStore(ConfigurationManager.AppSettings["BotStorage"]);
builder.Register(c => store)
.Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
.AsSelf()
.SingleInstance();
});
在我的 ICredentialProvider 实现中(如文章示例中所述)。如果我将客户连接字符串与他们的应用程序 ID 和密码一起存储,是否可以根据 customer/bot 序列化数据存储然后 save/read 该数据到上面的依赖项注入中提取该引用客户 Azure table 存储?
您需要创建一个实现 IBotDataStore<BotData>
的自定义机器人数据存储并使用它。我能够得到一个简单的,每次都创建相同的 TableBotDataStore
。下面是我使用的,每次发送消息时构造函数中的断点都会被击中。
public class CustomBotStore : IBotDataStore<BotData>
{
private IBotDataStore<BotData> _store;
public CustomBotStore()
{
string connString = ConfigurationManager.ConnectionStrings["BotState"].ConnectionString;
_store = new TableBotDataStore(connString, "testbotdata"); // requires Microsoft.BotBuilder.Azure Nuget package
}
public Task<bool> FlushAsync(IAddress key, CancellationToken cancellationToken)
{
return _store.FlushAsync(key, cancellationToken);
}
public Task<BotData> LoadAsync(IAddress key, BotStoreType botStoreType, CancellationToken cancellationToken)
{
return _store.LoadAsync(key, botStoreType, cancellationToken);
}
public Task SaveAsync(IAddress key, BotStoreType botStoreType, BotData data, CancellationToken cancellationToken)
{
return _store.SaveAsync(key, botStoreType, data, cancellationToken);
}
}
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
Conversation.UpdateContainer(
builder =>
{
builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly()));
builder.Register(c => new CustomBotStore())
.Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
.AsSelf()
.InstancePerLifetimeScope();
});
}
}
我不确定每个生命周期范围都有一个实例的含义是什么,因为示例使用单个实例。但是您应该能够使用它,然后检查构造函数中的 HttpContext
并使用正确的连接字符串。
我一直在用 C# 为多租户 azure 机器人实现以下功能,这非常适合验证应用凭据。
但是,我想知道机器人数据存储是否也可以这样做? 我目前有标准的 Azure Table 存储机器人数据存储,它使用 web.config:
中定义的单个连接字符串Conversation.UpdateContainer(
builder =>
{
builder.RegisterModule(new ReflectionSurrogateModule());
builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly()));
//var store = new InMemoryDataStore();
var store = new TableBotDataStore(ConfigurationManager.AppSettings["BotStorage"]);
builder.Register(c => store)
.Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
.AsSelf()
.SingleInstance();
});
在我的 ICredentialProvider 实现中(如文章示例中所述)。如果我将客户连接字符串与他们的应用程序 ID 和密码一起存储,是否可以根据 customer/bot 序列化数据存储然后 save/read 该数据到上面的依赖项注入中提取该引用客户 Azure table 存储?
您需要创建一个实现 IBotDataStore<BotData>
的自定义机器人数据存储并使用它。我能够得到一个简单的,每次都创建相同的 TableBotDataStore
。下面是我使用的,每次发送消息时构造函数中的断点都会被击中。
public class CustomBotStore : IBotDataStore<BotData>
{
private IBotDataStore<BotData> _store;
public CustomBotStore()
{
string connString = ConfigurationManager.ConnectionStrings["BotState"].ConnectionString;
_store = new TableBotDataStore(connString, "testbotdata"); // requires Microsoft.BotBuilder.Azure Nuget package
}
public Task<bool> FlushAsync(IAddress key, CancellationToken cancellationToken)
{
return _store.FlushAsync(key, cancellationToken);
}
public Task<BotData> LoadAsync(IAddress key, BotStoreType botStoreType, CancellationToken cancellationToken)
{
return _store.LoadAsync(key, botStoreType, cancellationToken);
}
public Task SaveAsync(IAddress key, BotStoreType botStoreType, BotData data, CancellationToken cancellationToken)
{
return _store.SaveAsync(key, botStoreType, data, cancellationToken);
}
}
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
Conversation.UpdateContainer(
builder =>
{
builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly()));
builder.Register(c => new CustomBotStore())
.Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
.AsSelf()
.InstancePerLifetimeScope();
});
}
}
我不确定每个生命周期范围都有一个实例的含义是什么,因为示例使用单个实例。但是您应该能够使用它,然后检查构造函数中的 HttpContext
并使用正确的连接字符串。