Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.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
Botframework Bot框架主动消息_Botframework_Azure Functions - Fatal编程技术网

Botframework Bot框架主动消息

Botframework Bot框架主动消息,botframework,azure-functions,Botframework,Azure Functions,我正在创建一个事件系统,其中可以使用聊天机器人触发外部系统上的作业。一旦外部系统接收到作业,它将运行需要运行的内容,然后通知azure中的队列作业已完成 接下来,我有一个函数应用程序,它查看这个队列。一旦收到新信息(包含ID、ConversationReferenceObject和作业响应),它将通过ProactiveMessage通知bot: var conversationReference = JsonConvert.DeserializeObject<ConversationRef

我正在创建一个事件系统,其中可以使用聊天机器人触发外部系统上的作业。一旦外部系统接收到作业,它将运行需要运行的内容,然后通知azure中的队列作业已完成

接下来,我有一个函数应用程序,它查看这个队列。一旦收到新信息(包含ID、ConversationReferenceObject和作业响应),它将通过ProactiveMessage通知bot:

var conversationReference = JsonConvert.DeserializeObject<ConversationReference>(subscription.ConversationReference);

MicrosoftAppCredentials.TrustServiceUrl(conversationReference.ServiceUrl);

var client = new ConnectorClient(new Uri(conversationReference.ServiceUrl), new MicrosoftAppCredentials(appId, appPassword));

var result = conversationReference.GetPostToBotMessage().CreateReply($@"[ProactiveMessage] Your job response: {response.data}");

client.Conversations.ReplyToActivity((Activity)result);
var conversationReference=JsonConvert.DeserializeObject(subscription.conversationReference);
MicrosoftAppCredentials.TrustServiceUrl(conversationReference.ServiceUrl);
var client=newconnectorclient(新Uri(conversationReference.ServiceUrl)、新MicrosoftAppCredentials(appId、appPassword));
var result=conversationReference.GetPostToBotMessage().CreateReply($@“[ProactiveMessage]您的作业响应:{response.data}”);
client.Conversations.ReplyToActivity((活动)结果);
现在,我希望聊天机器人拦截
[ProactiveMessage]
,然后仅在对话框当前未处于活动状态时才响应用户,而不是将此回复发布到机器人活动中—通常只是正确管理对话流


现在,我想知道
client.Conversations
是否有一个不同的功能,我可以发布到聊天机器人,而不是回复当前的对话?我有点卡住了。

如果要检查最初发送消息的用户的当前对话框堆栈,可以使用以下方法:

var fromConversation = conversationReference.GetPostToBotMessage();

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

    var stack = scope.Resolve<IDialogTask>();
    if (stack.Frames != null && stack.Frames.Count > 0)
    {
        var lastFrame = stack.Frames[stack.Frames.Count - 1];
        var frameValue = lastFrame.Target.GetType().GetFields()[0].GetValue(lastFrame.Target);
        if (frameValue is NodeRootDialog) //<-- only reply if user is in NodeRootDialog
        {
            var reply = fromConversation.CreateReply("used converation reference to reply");
            var connector = new ConnectorClient(new Uri(activity.ServiceUrl));
            await connector.Conversations.ReplyToActivityAsync(reply);
        }
    }
}
var fromConversation=conversationReference.GetPostToBotMessage();
使用(var scope=DialogModule.BeginLifetimeScope(Conversation.Container,fromConversation))
{
var botData=scope.Resolve();
等待botData.LoadAsync(默认值(CancellationToken));
var stack=scope.Resolve();
如果(stack.Frames!=null&&stack.Frames.Count>0)
{
var lastFrame=stack.Frames[stack.Frames.Count-1];
var frameValue=lastFrame.Target.GetType().GetFields()[0].GetValue(lastFrame.Target);

如果(frameValue为NodeRootDialog)//我不完全清楚您试图执行的操作。是否要向用户或机器人发送消息?使用ConversationReference对象,您可以在函数内加载该对话的状态,并确定对话堆栈是否有对话。如果您想要新对话,则需要在函数内创建该对话。这是一个函数应用程序中的代码片段。它会响应用户,但在发出主动消息之前,我想做一些进一步的检查。