C# 操作返回了无效的状态代码';禁止`。botframeworkv4

C# 操作返回了无效的状态代码';禁止`。botframeworkv4,c#,azure,botframework,azure-language-understanding,C#,Azure,Botframework,Azure Language Understanding,所以我在azure中创建了一个机器人并下载了它。路易斯的1000个免费电话达到了极限。我在azure portal中创建了一个订阅(我做了docker容器之类的事情)。直到第6步。当我单击端点url并直接在浏览器中查询时,它工作正常 我通过bot Emulator将其添加到bot中,方法是单击+登录服务并在其中添加bot模型。但是当我运行bot时,我得到了标题错误。我注意到在.bot文件中,由bot仿真器添加的创作密钥和订阅密钥是相同的 因此,我将订阅密钥更改为azure生成的密钥之一,但仍然存

所以我在azure中创建了一个机器人并下载了它。路易斯的1000个免费电话达到了极限。我在azure portal中创建了一个订阅(我做了docker容器之类的事情)。直到第6步。当我单击端点url并直接在浏览器中查询时,它工作正常

我通过bot Emulator将其添加到bot中,方法是单击+登录服务并在其中添加bot模型。但是当我运行bot时,我得到了标题错误。我注意到在.bot文件中,由bot仿真器添加的创作密钥和订阅密钥是相同的

因此,我将订阅密钥更改为azure生成的密钥之一,但仍然存在相同的错误。我尝试重新设置创作密钥,并删除我的luis.ai帐户并创建了一个新帐户。(仍然是同一封电子邮件,因为这是一封登录到azure portal的电子邮件。)仍然是一样的

这里有一些图片供参考和错误

我还尝试在luis.ai中测试它,得到了这个结果。

但当我检查时,它被设置为新资源。

下面是通过机器人模拟器添加luis后的机器人文件的图片。它具有相同的创作密钥和订阅密钥(仍然禁止)

所以我现在用订阅密钥更改了它(仍然是禁止的)。

在这里,当直接在URL中测试时,它工作正常。

供参考:

azure门户

路易斯·艾

错误呢

我如何在机器人中添加路易斯。

下面是bot服务的代码

using System;
using System.Collections.Generic;
using Microsoft.Bot.Builder.AI.Luis;
using Microsoft.Bot.Configuration;

namespace Microsoft.BotBuilderSamples
{
    public class BotServices
    {
        public BotServices(BotConfiguration botConfiguration)
        {
            foreach (var service in botConfiguration.Services)
            {
                switch (service.Type)
                {
                    case ServiceTypes.Luis:
                        {
                            var luis = (LuisService)service;
                            if (luis == null)
                            {
                                throw new InvalidOperationException("The LUIS service is not configured correctly in your '.bot' file.");
                            }

                            var endpoint = (luis.Region?.StartsWith("https://") ?? false) ? luis.Region : luis.GetEndpoint();
                            var app = new LuisApplication(luis.AppId, luis.AuthoringKey, endpoint);
                            var recognizer = new LuisRecognizer(app);
                            this.LuisServices.Add(luis.Name, recognizer);
                            break;
                        }
                }
            }
        }

        public Dictionary<string, LuisRecognizer> LuisServices { get; } = new Dictionary<string, LuisRecognizer>();
    }
}
使用系统;
使用System.Collections.Generic;
使用Microsoft.Bot.Builder.AI.Luis;
使用Microsoft.Bot.Configuration;
命名空间Microsoft.BotBuilderSamples
{
公共类机器人服务
{
公共机器人服务(BotConfiguration BotConfiguration)
{
foreach(botConfiguration.Services中的var服务)
{
交换机(服务类型)
{
案例服务类型。路易斯:
{
var luis=(LuisService)服务;
如果(luis==null)
{
抛出新的InvalidOperationException(“您的“.bot”文件中未正确配置LUIS服务。”);
}
var endpoint=(luis.Region?.StartsWith(“https:/”)false)?luis.Region:luis.GetEndpoint();
var app=新的LuisApplication(luis.AppId、luis.AuthoringKey、endpoint);
var识别器=新的LuisRecognizer(app);
this.LuisServices.Add(luis.Name,识别器);
打破
}
}
}
}
公共字典LuisServices{get;}=newdictionary();
}
}

我已经试着解决这个问题4天了。谢谢

感谢您提供的所有图片。这是一个巨大的帮助!问题是:

默认情况下,您的代码在此部分(第二行)中查找
AuthoringKey

由于您的
.bot
文件仍将
authoringKey
设置为以
ad9c…
开头的密钥,该密钥已达到极限,因此您的bot将继续运行403错误

因此,在您的
.bot
文件中,将该
创作密钥
替换为您的
端点密钥之一(它们以
12ccc…
b575…
开头)

我理解您对此的困惑,特别是因为这需要您在
authoringKey
属性中放置
endpointKey
。我知道路易斯机器人使用钥匙的方式即将发生一些变化,但这些变化可能需要一个月或更长的时间

或者,您可以更改:

var app = new LuisApplication(luis.AppId, luis.AuthoringKey, endpoint);
致:

注意:如果您做了这些更改中的任何一个,LUIS只能进行查询(这通常是很好的),因为创作键完成了其他所有操作(请参阅下面的参考资料)

工具书类 这些对你来说并没有那么多,其他人可能会遇到这一点


您能否共享初始化
LuisApplication
的代码?您可以在这里找到。谢谢您的回复。我用luis的botservice应用程序更新了这个问题。你能验证一下吗?从bot文件中删除这些luis条目。添加一个新的端点键,确保使用以
12ccc
b575
开头的端点键。根本不要使用以ad9c开头的编写键。你还收到403错误吗?@mdrichardson模拟器会自动添加这些密钥。然后我直接在bot文件中更改了它们,可以吗?是的,先生,当我将订阅密钥更改为其中一个密钥时,我仍然收到禁止的错误。我还没有在azure中发布此bot是否相关?因为这是新的,我重构了代码。但是这个机器人以前的版本是在azure上发布的。我想值得一提的是,我创建了一个新的luis.ai帐户,有免费的启动密钥,没有订阅密钥,并且工作没有问题。顺便问一下,先生,你能检查一下聊天吗。bot模拟器中的每条消息前都出现了一些东西。奇怪的是,我的感谢评论不见了。再次感谢您,先生。在聊天中已回复。先生,您可以查看此messenger位置快速回复问题吗?谢谢
var app = new LuisApplication(luis.AppId, luis.AuthoringKey, endpoint);
var app = new LuisApplication(luis.AppId, luis.SubscriptionKey, endpoint);