gpt4 book ai didi

c# - 迁移了机器人状态提供者,但仍在调用 state.botframework.com

转载 作者:太空狗 更新时间:2023-10-29 23:28:44 26 4
gpt4 key购买 nike

我迁移到 Table Azure Provider 以管理 Microsoft 机器人框架状态。

在我的遥测中,我看到正在对我的新表 Azure 存储进行依赖项调用,但是我仍然看到对 state.botframework.com 进行了很多调用,并且有些具有通常的随机缓慢响应时间。

这似乎不正常,因为我希望所有调用都定向到我的新私有(private)国家提供者:

例子: https://state.botframework.com/v3/botstate/facebook/users/999999999999

调用新私有(private)状态提供者的示例: https://xxxxxxxxxx.table.core.windows.net:443/botdata(PartitionKey= 'facebook:private',RowKey='XXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXX

其他潜在的相关信息:

  • 在切换到 table azure 存储之前,该应用程序使用 Microsoft State provider 运行了一段时间
  • 我不会在机器人状态下保留任何关键任务信息,只会在与用户对话的状态下保留;我可以在没有重大影响的情况下放松它。
  • 机器人使用保存在自定义 SQL 数据库中的恢复 cookie 发送通知。
  • 这是 Table Azure Provider 在 Autofac 模块中注册的方式:
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);

//Register custom datastore
builder
.RegisterKeyedType<TableBotDataStore, IBotDataStore<BotData>>()
.Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
.WithParameter((pi, c) => pi.Name == "connectionString",
(pi, c) =>
ConfigurationManager.ConnectionStrings["X"].ConnectionString)
.SingleInstance();

builder.RegisterAdapterChain<IBotDataStore<BotData>>
(
typeof(TableBotDataStore),
typeof(CachingBotDataStore)

)
.InstancePerLifetimeScope();
}
  • 我有以下方法来检查保存的状态版本与正在运行的服务版本的比较。引入此代码是因为有时用户的序列化对话框状态与新版本对话框中所做的更改不兼容。
public static async Task CheckClientVersion(Activity activity)
{
StateClient stateClient = activity.GetStateClient();
BotData userData = stateClient.BotState.GetUserData(activity.ChannelId, activity.From.Id);
if (userData?.GetProperty<string>("version")?.CompareTo(Assembly.GetExecutingAssembly().GetName().Version.ToString()) != 0)
{

string[] result = await stateClient.BotState.DeleteStateForUserAsync(activity.ChannelId, activity.From.Id, CancellationToken.None);
userData = stateClient.BotState.GetUserData(activity.ChannelId, activity.From.Id);
userData.SetProperty<string>("version", Assembly.GetExecutingAssembly().GetName().Version.ToString());
await stateClient.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);
}
}

最佳答案

您的第二个代码片段是来自 Dialog 还是 MessagesController?问题是您使用的 activity.GetStateClient Always 调用默认状态客户端而不是您自己的自定义客户端。

如果您要在 MessagesController 中操作状态,则必须使用类似于下面的代码来完成您想要的操作

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.Type == ActivityTypes.Message)
{

var message = activity as IMessageActivity;
using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
{
var botDataStore = scope.Resolve<IBotDataStore<BotData>>();
var key = Address.FromActivity(message);

var userData = await botDataStore.LoadAsync(key, BotStoreType.BotUserData, CancellationToken.None);

userData.SetProperty("key 1", "value1");
userData.SetProperty("key 2", "value2");

await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);
await botDataStore.FlushAsync(key, CancellationToken.None);
}
await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
}
}

回答您的后续问题:

using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
{
var token = new CancellationToken();
var botData = scope.Resolve<IBotData>();
await botData.LoadAsync(token);

var stack = scope.Resolve<IDialogStack>();
stack.Reset();

botData.UserData.Clear();
botData.ConversationData.Clear();
botData.PrivateConversationData.Clear();
await botData.FlushAsync(token);

var botToUser = scope.Resolve<IBotToUser>();
await botToUser.PostAsync(message.CreateReply($"{timerMessage} Conversation aborted."));
}

关于c# - 迁移了机器人状态提供者,但仍在调用 state.botframework.com,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47944060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com