【问题标题】:Bot Framework .Net Core get string variable from IFrameBot Framework .Net Core 从 IFrame 获取字符串变量
【发布时间】:2019-07-29 01:05:24
【问题描述】:

问题在于使用 .Net Core 通过 Bot Framework 创建 Bot 应用程序。 在 .Net Framework 中,我使用 API 来创建 Bot App。在初始方法中,我传递字符串参数并从 IFrame Url 获取此值,但在 .Net Core 中,我使用 OnTurnAsync 方法并且无法覆盖此方法以将字符串参数作为“userName”传递。 我在下面分享 .Net 核心和 .Net 框架初始方法。

我正在通过 IFrame 调用机器人应用程序,例如; https://webchat.botframework.com/...&userName=test' style="width:600px; height:600px;">

那么如何将参数传递给 OnTurnAsync 方法?

.Net 框架

   public async Task<HttpResponseMessage> Post([FromBody]Activity activity, string userName)
    {
        if (activity.Type == ActivityTypes.Message)
        {                
            var keyword = activity.Text.ToLower().ToEnglish();
            var responseAttachment = KeywordHelper.GetAttachmentResult(keyword);
            if (responseAttachment != null)
            {
                var answer = ((HeroCard)responseAttachment.Content).Title.ToString();
                conversation.Response = answer;
                this.conversationService.InsertToConversation(conversation);
                var connector = new ConnectorClient(new Uri(activity.ServiceUrl));
                var reply = activity.CreateReply();
                reply.Attachments.Add(responseAttachment);
                await connector.Conversations.ReplyToActivityAsync(reply);

                activity.Type = ActivityTypes.Message;
            }
        }
    }

.Net 核心

        public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
    {
            if (turnContext.Activity.Type == ActivityTypes.Message)
            {
                var userName = "userName";

                var keyword = turnContext.Activity.Text.ToLower().ToEnglish();
                var responseAttachment = KeywordHelper.GetAttachmentResult(keyword);

                if (responseAttachment != null)
                {
                    var answer = ((HeroCard)responseAttachment.Content).Title.ToString();
                    conversation.Response = answer;
                    this.conversationService.InsertToConversation(conversation);
                    var connector = new ConnectorClient(new Uri(turnContext.Activity.ServiceUrl));


                    var reply = turnContext.Activity.CreateReply();
                }

            }
    }

【问题讨论】:

  • 您仍然可以在 V4 中使用控制器,如以下 mvc 示例所示:github.com/Microsoft/BotBuilder-Samples/tree/master/samples/…
  • 所以,我认为应该重写 OnTurnAsync 方法以从 Iframe 获取 userName 参数,但我不能。如何在初始方法中获取 userName 参数?
  • 如果只需要用户名,可以从activity.From.Name中获取(userid和username是webchat会从url字符串传入activity的两个参数)。

标签: .net-core botframework bots azure-language-understanding azure-bot-service


【解决方案1】:

您仍然可以将 Web Api 控制器与 BotBuilder V4 一起使用,如下例所示: https://github.com/Microsoft/BotBuilder-Samples/blob/samples-work-in-progress/samples/csharp_dotnetcore/13.core-bot/Controllers/BotController.cs

[Route("api/messages")]
[ApiController]
public class BotController : ControllerBase
{
    private readonly IBotFrameworkHttpAdapter Adapter;
    private readonly IBot Bot;

    public BotController(IBotFrameworkHttpAdapter adapter, IBot bot)
    {
        Adapter = adapter;
        Bot = bot;
    }

    [HttpPost]
    public async Task PostAsync()
    {
        // Delegate the processing of the HTTP POST to the adapter.
        // The adapter will invoke the bot.
        await Adapter.ProcessAsync(Request, Response, Bot);
    }
}

但是,如果您将用户 ID 和用户名作为查询字符串参数传递给 WebChat iframe,那么您可以从 activity.From.Name 检索用户名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2019-01-31
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多