Microsoft bot服务在本地可正常运行,但在网络聊天频道中无法正常运行

时间:2018-08-24 05:20:39

标签: c# azure botframework

在本地漫游器中工作正常,但在网络聊天频道上“向此漫游器发送此消息时出错:HTTP状态代码网关超时”错误,但漫游器在第二次响应后正确运行

控制器代码

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {

        if (activity.Type == ActivityTypes.Message)
        {
            await Conversation.SendAsync(activity, () => new EchoDialog());
        }
         else if (message.Type == ActivityTypes.ConversationUpdate)
        {
            // Handle conversation state changes, like members being added and removed
            // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
            // Not available in all channels
            IConversationUpdateActivity iConversationUpdated = message as IConversationUpdateActivity;
            if (iConversationUpdated != null)
            {
                ConnectorClient connector = new ConnectorClient(new System.Uri(message.ServiceUrl));
                foreach (var member in iConversationUpdated.MembersAdded ?? System.Array.Empty<ChannelAccount>())
                {
                    // if the bot is added, then   
                    if (member.Id == iConversationUpdated.Recipient.Id)
                    {
                        var reply = ((Activity)iConversationUpdated).CreateReply("Hi, Welcome to Systenics.");
                        await connector.Conversations.ReplyToActivityAsync(reply);
                        await Conversation.SendAsync(message, () => new EchoDialog());
                    }
                }
            }


        }
        else
        {
           await HandleSystemMessage(activity);
        }
        var response = Request.CreateResponse(HttpStatusCode.OK);
        return response;
    }

聊天对话框

public async Task StartAsync(IDialogContext context)
    {
        context.Wait(this.ShowOptions);
    }
    public virtual async Task ShowOptions(IDialogContext context, IAwaitable<IMessageActivity> activity)
    {
        var message = await activity;
        var descriptions = new string[] { "Request a Quote", "More Information About Jobs" };
        PromptDialog.Choice(
            context: context,
            resume: ChoiceReceivedAsync,
            options: descriptions,
            prompt: "Please select an option below:",
            retry: "Selected option not available.",
            promptStyle: PromptStyle.Auto
            );
    }

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

您似乎想捕获ConversationUpdate活动并创建并发送一条虚假消息以初始化对话框,以便通过PromptDialog.Choice()方法提示一组选择之一。我建议您先指定活动的Text属性,然后再将其发送给初始化对话框,然后可以通过检查对话框中的消息活动Text属性来执行不同的操作。

根据您的情况,我创建了以下示例代码,这些示例代码对我来说适用于Web聊天,您可以参考它。

在MessagesController中:

else if (activity.Type == ActivityTypes.ConversationUpdate)
{
    // Handle conversation state changes, like members being added and removed
    // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
    // Not available in all channels

    IConversationUpdateActivity iConversationUpdated = activity as IConversationUpdateActivity;
    if (iConversationUpdated != null)
    {
        ConnectorClient connector = new ConnectorClient(new System.Uri(activity.ServiceUrl));
        foreach (var member in iConversationUpdated.MembersAdded ?? System.Array.Empty<ChannelAccount>())
        {
            // if the bot is added, then   
            if (member.Id == iConversationUpdated.Recipient.Id)
            {
                var reply = ((Activity)iConversationUpdated).CreateReply("Hi, Welcome to Systenics.");
                await connector.Conversations.ReplyToActivityAsync(reply);

                //set value to Text property
                activity.Text = "show choices";
                await Conversation.SendAsync(activity, () => new EchoDialog());
            }
        }
    }

}

在对话框中:

public async Task StartAsync(IDialogContext context)
{
    context.Wait(MessageReceivedAsync);
}


public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
    var activity = await result as Activity;

    var mes = activity.Text?.ToString();

    if (mes == "show choices")
    {
        var descriptions = new string[] { "Request a Quote", "More Information About Jobs" };
        PromptDialog.Choice(
            context: context,
            resume: ChoiceReceivedAsync,
            options: descriptions,
            prompt: "Please select an option below:",
            retry: "Selected option not available.",
            promptStyle: PromptStyle.Auto
            );
    }
    else
    {
        if (mes == "More Information About Jobs")
        {
            var replymes = context.MakeMessage();
            replymes.Text = "Click on this link to know more about jobs [https//www.abc.com](https//www.abc.com)";

            await context.PostAsync(replymes);
        }
        else if (mes == "Request a Quote")
        {
            //your code logic here
        }
        else
        {
            await context.PostAsync($"You sent {activity.Text}");
        }


        context.Wait(MessageReceivedAsync);
    }
}

测试结果:

enter image description here