【问题标题】:How to implement my REST API with the QnA maker? Getting OnMessageActivityAsync error如何使用 QnA maker 实现我的 REST API?获取 OnMessageActivityAsync 错误
【发布时间】:2019-08-05 23:01:51
【问题描述】:

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { //I have code here that works fine. }

第二种方法

public QnABot(IConfiguration configuration, ILogger<QnABot> logger, IHttpClientFactory httpClientFactory)
    {
        _configuration = configuration;
        _logger = logger;
        _httpClientFactory = httpClientFactory;
    }


    protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
    {
        var httpClient = _httpClientFactory.CreateClient();

        var qnaMaker = new QnAMaker(new QnAMakerEndpoint
        {
            KnowledgeBaseId = _configuration["QnAKnowledgebaseId"],
            EndpointKey = _configuration["QnAAuthKey"],
            Host = GetHostname()
        },
        null,
        httpClient);

        _logger.LogInformation("Calling QnA Maker");

        // The actual call to the QnA Maker service.
        var response = await qnaMaker.GetAnswersAsync(turnContext);
        if (response != null && response.Length > 0)
        {
            await turnContext.SendActivityAsync(MessageFactory.Text(response[0].Answer), cancellationToken);
        }
        else
        {
            await turnContext.SendActivityAsync(MessageFactory.Text("No QnA Maker answers were found."), cancellationToken);
        }
    }

错误:“Type QnABot”已经定义了一个名为“OnMessageActivityAsync”且参数类型相同的成员。

我使用 HTTP 客户端在我的机器人中使用了第三方 API。现在,我想将 QnA 制造商添加到我的机器人中。 问题是我只希望用户在需要时使用 API,而 QnA 制造商出于不同的原因。 基本上,QnA 制造商拥有我们在我公司使用的特定应用程序的信息。 然而,API 知识库回答了自然语言问题,例如“如何在我的 iPhone 上安装 Outlook?”因此,用户可以选择是否需要来自 QnA 制造商的特定应用程序信息或询问“如何”来自 API 的问题。

我也已经制作了一个 QnA 机器人。我有 QnA 制造商的代码,现在我试图同时实现我的 web api 代码和 qna 制造商代码。我已使用 API 中的逻辑将其与我的 QnAbot.cs 文件一起使用,但我收到此 OnMessageActivityAsync 错误。显然是因为我有两个,而程序不知道何时访问哪个方法。那么如何区分这两种方法呢?

出现“OnMessageActivityAsync”错误,因为我有两种方法,但我不知道如何区分这两种方法。我需要机器人能够查询 API 或 QnA 制造商,而不是一起查询。This is my first OnMessageActivityAsync second on messageactivity which gives me an error

【问题讨论】:

  • 您只给了我们编译器有问题的函数/部分 hte 代码。您实际上并没有告诉我们错误消息是什么。

标签: c# rest botframework azure-bot-service qnamaker


【解决方案1】:

信息很清楚。您两次获得了具有相同参数的相同函数。这是不允许的。允许具有相同名称区域的多个函数,但只能在 overloading rules 内 - 这要求参数不同,因此编译器可以将它们分开。

根据名称,这些是事件处理程序,签名是固定的。这意味着他们需要改变名称。

我看到了这些选项:

1) 您手动定义和注册两者之一。这样你就可以定义名字了

2) 删除两者,将您注册的元素在设计器中命名。然后尝试再次实现它们 - 元素的名称应该用作前缀。

3) 此处不可用,因为这些事件不遵循正确的事件处理程序模式。

我建议学习如何手动进行事件注册和定义。您不能永远依赖设计师的帮助。

【讨论】:

  • 感谢克里斯托弗的建议。我对所有这些东西都很陌生,所以我依靠前端应用程序/设计师为我完成工作,但我也慢慢开始理解后端代码。对于事件注册和定义,您能否为我指出一个特定的资源,一个我可以学习的链接?如果你能帮我解决这个问题,你会非常好。我不知道从哪里开始搜索。
  • @user458622 事件处理程序和设计人员在 Windows 窗体中大放异彩,所以这是一个好的开始:docs.microsoft.com/en-us/dotnet/framework/winforms/… |尤其是你在运行时学习做设计工作的那个:docs.microsoft.com/en-us/dotnet/framework/winforms/…
  • @user458622 对于 Windows 窗体,规则是这样的:1) 设计器不能做你不能做的事情 2) 设计器在它的部分类的一部分上工作。部分类的部分将在编译时进行组合 3) Designer 编写的内容将通过在构造函数中调用InitializeComponents() 来执行。 |所以没有魔法发生,只是其他人的代码为你编写了一些代码并以图形方式显示。
  • 非常感谢您提供的所有资源。看着那,我现在记得几年前我在 C# 中做过这个设计器的东西,但我有所有这些项目的设计器窗口。使用我从 azure 门户网站下载的专门用于本地机器人开发的代码,没有设计器或类似的东西。您能否指导如何访问它?
  • 我正在使用 ASP.NET Web 应用程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 2019-12-13
  • 1970-01-01
  • 2020-05-08
相关资源
最近更新 更多