【问题标题】:POST 500 Error Bot Emulator Localhost for IIS hosted Bot用于 IIS 托管机器人的 POST 500 错误机器人模拟器本地主机
【发布时间】:2017-12-09 12:18:27
【问题描述】:

我使用 IIS 在本地托管我的机器人,如下所示:https://localhost/MyBot.目前,当我尝试在机器人模拟器中连接到我的机器人时,我收到 POST 500 错误,并且无法发送消息。我是新手,大多数将机器人发布到本地服务器的文档都是有限的。但是,我可以从浏览器成功打开此链接。

我是否因为没有 https://localhost/Bridget/api/messages 目录/url 而遇到此错误?我尝试在 IIS 中创建虚拟目录,但这无助于解决我的问题。我需要隧道软件吗?是否有使用 IIS 在本地部署机器人并通过机器人模拟器连接到它的简单教程?

这是我在模拟器中看到的错误:

Bot Emulator Error

使用 ngrok 隧道软件,这是我看到的:

NGROK Bot Emulator Error

这是处理传入 POST 消息的代码:

/// <summary>
/// POST: api/Messages
/// Receive a message from a user and reply to it
/// </summary>
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
    if (activity.Type == ActivityTypes.Message)
    {
        // Strip any @mentions
        Mention[] m = activity.GetMentions();
        for (int x = 0; x < m.Length; x++)
        {
            if (m[x].Mentioned.Id == activity.Recipient.Id)
            {
                if (m[x].Text != null)
                {
                    activity.Text = activity.Text.Replace(m[x].Text, "");
                }
            }
        }

        await stateClient.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);

        await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
    }
    else if (activity.Type == ActivityTypes.Invoke)
    {
            // Some Code...
    }
    else
    {
        HandleSystemMessage(activity);
    }
    var response = Request.CreateResponse(HttpStatusCode.OK);
    return response;
}

【问题讨论】:

  • 当您在模拟器中获得conversationUpdate 时,可以联系您的机器人,所以这是一件好事,现在您在处理/回复传入消息时遇到问题。也许你应该先尝试用基本的回声来回复。并且可能在文件或某处记录异常,以便能够从“服务器端”查看这些错误

标签: iis emulation botframework


【解决方案1】:

我遇到这个错误是因为我没有 https://localhost/Bridget/api/messages 目录/url吗?

你的两个截图都显示你试图连接到/api/messages,你说你没有,所以很自然,你会得到一个错误。

请发布您的机器人代码部分,以显示您在哪里收听消息。例如,NodeJS 机器人将具有以下内容:

var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, () => {
    console.log('%s listening to %s', server.name, server.url); 
});

var connector = new builder.ChatConnector({
    appId: process.env.MICROSOFT_APP_ID,
    appPassword: process.env.MICROSOFT_APP_PASSWORD
});
var bot = new builder.UniversalBot(connector);
server.post('/api/messages', connector.listen());

最后一行显示了在当前应用程序(由 NodeJS 使用 restify 库运行)中在 /api/messages 处的连接监听消息。你的有什么?

【讨论】:

  • 我已经能够连接,但现在机器人模拟器中出现 405 错误。上面显示了 Microsoft 处理消息的包含代码。我正在使用机器人框架 SDK。我将它发布到一个文件中,然后使用 IIS 创建一个 localhost 链接。现在我正在尝试以这种方式通过模拟器访问它。我不认为我应该创建一个名为 api/messages 的虚拟目录...
  • 你有没有修改过你的路由?您的控制器文件的名称是什么?默认情况下,它应该是 MessagesController.cs,如果你没有修改路由,你的默认路由将是/api/messages。你能在 Visual Studio 中运行它而不会出错吗?对于 Web API 中的 405 错误,您可能需要查看 this
  • 当您发布机器人时,它会生成一个不包含 MessagesController.cs 文件的文件夹,但它是正确的名称。 Here is a pic of the issue I am now facing 出于某种原因,我可以连接到机器人,但我无法发送 POST 请求?
  • 控制器被编译到DLL中,但我的假设是你没有改变路由,所以你应该仍然指向/api/messages作为你的端点。 500 错误表示代码执行存在问题。 405 错误必须在 REST 调用期间处理不正确或冲突的动词。你能在本地调试你的代码吗?在 Visual Studio 中启动它,在控制器中设置一个断点,看看它是否命中?
  • 我已经测试了我的代码,它可以在 VS 中运行。现在我收到 405 错误?表示目前不支持 POST 请求。我已经根据互联网的说明添加了处理程序并编辑了我的 web.config 文件,但似乎没有任何东西可以让它工作?我的配置文件和 dll 不应该处理这个吗?使用 IIS 部署机器人的正确方法(逐步)是什么?
【解决方案2】:

我解决了这个问题,这是因为 IIS 不允许 POST 请求。我所做的只是去请求过滤并添加动词 POST:

IIS POST Fix

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多