Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已迁移bot状态提供程序,但仍在调用state.botframework.com_C#_Botframework - Fatal编程技术网

C# 已迁移bot状态提供程序,但仍在调用state.botframework.com

C# 已迁移bot状态提供程序,但仍在调用state.botframework.com,c#,botframework,C#,Botframework,我迁移到表Azure提供程序以管理Microsoft bot framework状态 在我的遥测中,我看到对我的新表Azure Storage进行了依赖项调用,但是我仍然看到对state.botframework.com进行了很多调用,其中一些调用的响应时间通常很慢 这似乎不正常,因为我希望所有呼叫都指向我的新私人状态提供商: 例如: 调用新的私有状态提供程序的示例: “facebook:private”,行键=“XXXXXXXXXXXXX-XXXXXXXXXXXXX” 其他潜在相关信息:

我迁移到表Azure提供程序以管理Microsoft bot framework状态

在我的遥测中,我看到对我的新表Azure Storage进行了依赖项调用,但是我仍然看到对state.botframework.com进行了很多调用,其中一些调用的响应时间通常很慢

这似乎不正常,因为我希望所有呼叫都指向我的新私人状态提供商:

例如:

调用新的私有状态提供程序的示例: “facebook:private”,行键=“XXXXXXXXXXXXX-XXXXXXXXXXXXX”

其他潜在相关信息:

  • 在切换到表azure存储之前,该应用程序使用Microsoft State provider运行了一段时间
  • 我不会在bot状态下保留任何关键任务信息,只保留与用户对话的状态;我可以在没有重大影响的情况下放松
  • bot使用保存在自定义SQL数据库中的恢复cookie发送通知
  • 以下是表Azure提供程序在Autofac模块中注册的方式:
protected override void Load(ContainerBuilder生成器)
{
基础荷载(建筑商);
//注册自定义数据存储
建设者
.RegisterKeyedType()
.Keyed(AzureModule.Key_数据存储)
.WithParameter((pi,c)=>pi.Name==“connectionString”,
(pi,c)=>
ConfigurationManager.ConnectionString[“X”].ConnectionString)
.SingleInstance();
builder.RegisterAdapterChain
(
类型(TableBotDataStore),
类型(CachingBotDataStore)
)
.InstancePerLifetimeScope();
}
  • 我使用以下方法检查保存的状态版本与运行的服务版本。引入此代码是因为有时用户的序列化对话框状态与新版本对话框中所做的更改不兼容
公共静态异步任务CheckClientVersion(活动)
{    
StateClient StateClient=activity.GetStateClient();
BotData userData=stateClient.BotState.GetUserData(activity.ChannelId、activity.From.Id);
if(userData?.GetProperty(“版本”)?.CompareTo(Assembly.getExecutionGassembly().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(“version”,Assembly.getExecutionGassembly().GetName().version.ToString());
等待stateClient.BotState.SetUserDataAsync(activity.ChannelId、activity.From.Id、userData);
}
}

是您的第二个代码段,是来自
对话框
还是
消息控制器
?问题是您使用的是
activity.GetStateClient
,它总是调用默认的状态客户端,而不是您自己的自定义客户端

为了实现您想要的功能,如果您正在操作
消息控制器中的状态,则必须使用类似于下面的代码

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());
                }
            }   
公共异步任务发布([FromBody]活动)
{
if(activity.Type==ActivityTypes.Message)
{
var消息=活动作为IMessageActivity;
使用(var scope=DialogModule.BeginLifetimeScope(Conversation.Container,message))
{
var botDataStore=scope.Resolve();
var key=地址。FromActivity(消息);
var userData=await botDataStore.LoadAsync(key,BotStoreType.BotUserData,CancellationToken.None);
SetProperty(“键1”、“值1”);
SetProperty(“键2”、“值2”);
等待botDataStore.SaveAsync(key,BotStoreType.BotUserData,userData,CancellationToken.None);
等待botDataStore.FlushAsync(key,CancellationToken.None);
}
wait Conversation.sendaync(活动,()=>newdialogs.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."));
            }
使用(var scope=DialogModule.BeginLifetimeScope(Conversation.Container,message))
{
var token=新的CancellationToken();
var botData=scope.Resolve();
等待botData.LoadAsync(令牌);
var stack=scope.Resolve();
stack.Reset();
botData.UserData.Clear();
botData.ConversationData.Clear();
botData.PrivateConversationData.Clear();
等待botData.FlushAsync(令牌);
var botToUser=scope.Resolve();
等待botToUser.PostAsync(message.CreateReply($“{timerMessage}会话中止”);
}

Yes确实在控制器中执行botDataStore.FlushAsync(key,CancellationToken.None);删除包括会话状态在内的所有数据?不,它实际上不做任何事情,也不需要使用。这是我以前实现的代码片段中的遗留内容。好的,当版本更改时,我需要删除会话状态,以防出现错误的序列化会话状态。我该怎么做?