【问题标题】:Getting an "Internal Server Error" when trying to post messages in Microsoft Bot Connector by Direct Line API尝试通过 Direct Line API 在 Microsoft Bot 连接器中发布消息时出现“内部服务器错误”
【发布时间】:2016-04-27 04:45:14
【问题描述】:

我已经设置了一个简单的机器人 - 在 Bot Connector 中注册 - 我只是想设置基本的 Direct Line API 连接。在我的单独应用程序 (C#) 中,我通过使用 HttpClient 并检索对话 ID(通过反序列化响应)成功地启动对话。

但是,然后我尝试向线程发布消息,我收到“内部服务器错误”,错误代码 500。附加的唯一消息是“发生错误。”。

using(var client =  new HttpClient())
{
client.BaseAddress = new Uri("https://directline.botframework.com/");
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Add("Authorization", $"BotConnector {token}");
client.DefaultRequestheaders.Add("Type", "Message");
var post_content = new StringContent("Adding to the convo", Encoding.UTF8, "application/json");
HttpResponseMessage response = new client.PostAsync($"api/conversations/{convo_id}/messages", post_content).Result;
log(response.ReadAsStringAsync().Result);
}

log 是一种输出到控制台的简单方法,而 convo_id 是从对站点的初始调用中获取的 conversationId。

【问题讨论】:

  • 您发布了完整的错误信息吗?这个答案表明应该有一个与之相关的数字,也许这可以帮助找到答案:stackoverflow.com/questions/18713666/…
  • 编辑响应:这是一个简单的 500 错误。这就是混乱:Bot Connector API 没有提供任何详细信息来解释发生了什么问题。

标签: c# botframework


【解决方案1】:

代码行:

var post_content = new StringContent("Adding to the convo", Encoding.UTF8, "application/json");

是问题的根源。 查看预期消息的格式: http://docs.botframework.com/sdkreference/restapi-directline/#!/Conversations/Conversations_PostMessage

它需要一个带有一堆字段的 JSON 对象。我能够解决您的问题并更改了消息的内容,并且错误消失了。

Message message = new Message(conversationId: convId, text: "Happy days");
string output = JsonConvert.SerializeObject(message);
var post_content = new StringContent(output,Encoding.UTF8,"application/json");

【讨论】:

  • 一个很好的收获!谢谢您的帮助!同时,我已切换到使用您的第一个答案确定的 NuGet 包,但我很高兴能够了解全部情况。我希望文档尽快变得更清晰,但是您在这里的见解非常有价值。
【解决方案2】:

使用 Microsoft.Bot.Connector.DirectLine NuGet 包,我在 DirectLine API 方面取得了一些成功。

var uri = new Uri("https://directline.botframework.com");

DirectLineClientCredentials creds = new DirectLineClientCredentials(secret);

DirectLineClient client = new DirectLineClient(uri, creds);
Conversations convs = new Conversations(client);

string waterMark;

var conv = convs.NewConversation();
var set = convs.GetMessages(conv.ConversationId);
waterMark = set.Watermark;

Message message = new Message(conversationId: conv.ConversationId, text: "your text");
Console.WriteLine(message.Text);
convs.PostMessage(conv.ConversationId, message);

set = convs.GetMessages(conv.ConversationId, waterMark);
PrintResponse(set);
waterMark = set.Watermark;

PrintResponse 定义为:

private static void PrintResponse(MessageSet set)
{
  var q = from x in set.Messages
          where x.FromProperty == "<YOUR BOTS APP ID HERE>"
          select x.Text;

  foreach (var str in q.ToList())
   {
      Console.WriteLine(">> " +str);
   }


}

【讨论】:

  • 是的,我发现那个包裹......令人沮丧的是,据我所知,它完全没有记录。但不幸的是,这并不能解决简单 REST 命令为何失败的问题。
猜你喜欢
  • 2018-05-20
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多