【问题标题】:Problems with Getting Response on the deployed bot;在部署的机器人上获得响应的问题;
【发布时间】:2020-01-03 17:31:04
【问题描述】:

我在获取允许获取组成员的 REST API 响应时遇到了一些问题 (GET {serviceUrl}/v3/conversations/{conversationId}/members)。我正在 Bot Emulator 中调试我的机器人,它在这里运行良好

- 这就是它在机器人模拟器中显示的内容

- 但这就是它在 Azure 上的显示方式。

主要问题是我真的无法识别问题。我知道问题出在请求中,因为 getResponse 方法在服务器上时会导致所有程序崩溃(但为什么这在机器人模拟器中有效?)。这里是代码(我使用的是 .NET CORE,Microsoft Bot Framework)。 授权中的 P.S.{id} 是正确的,我从另一个请求中得到它(但与请求在任何地方都有效的问题请求不同),{url} 是 turnContext.Activity.ServiceUrl

HttpWebRequest webRequest23 = (HttpWebRequest)WebRequest.Create($"{url}/v3/conversations/{turnContext.Activity.Conversation.Id}/members");

await turnContext.SendActivityAsync($"{url}/v3/conversations/{turnContext.Activity.Conversation.Id}/members");

await turnContext.SendActivityAsync(turnContext.Activity.Conversation.Id);

webRequest23.ContentType = "application/json";
webRequest23.Headers["Authorization"] = $"Bearer {id}";
WebResponse response2 = webRequest23.GetResponse();//crash here
await turnContext.SendActivityAsync("3");

string smth25 = "";
using (StreamReader stream = new StreamReader(response2.GetResponseStream(), true))
{
        smth25 = stream.ReadToEnd();
}
JArray jsonArray = JArray.Parse(smth25);
List<string> names = new List<string>();
foreach(var x in jsonArray)
{
         var name = JObject.Parse(x.ToString())["name"].ToString();
         names.Add("@" + name);
}
         string s = "This group consists of - ";
         foreach (var x in names){

         s += "" + x + ",";
}
await turnContext.SendActivityAsync(s);

这是我获得 id 的方式:

string stringData = "grant_type=client_credentials&client_id=66b16ef5-d086-40b7-ae9c-2f50a1f028c6&client_secret=yRUYg4g.:ANuw3Y_01V=@.JkAv=@g3EE&scope=https%3A%2F%2Fapi.botframework.com%2F.default";
var data = Encoding.Default.GetBytes(stringData);
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token");
webRequest.Host = "login.microsoftonline.com";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.Method = "POST";
var newStream = webRequest.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
WebResponse response = webRequest.GetResponse();
string line = string.Empty;

string smone = "";
using (StreamReader stream = new StreamReader(response.GetResponseStream(), true))
{
    smone = stream.ReadToEnd();
}
var id = JObject.Parse(smone)["access_token"].ToString();

【问题讨论】:

  • @dbc 这是一个问题,而不是代码。我认为问题不在解析中,因为它在模拟器中工作)))。你能帮我吗?因为我真的很不高兴我不知道该怎么办......
  • 希尔顿的回答可以接受吗?

标签: c# json rest api botframework


【解决方案1】:

我不完全理解您的“turnContext.SendActivityAsync”行应该做什么,但它可能在机器人模拟器中工作,因为模拟器不需要像 Teams 那样的适当的经过身份验证的会话。无论如何,这样的事情实际上应该对您有所帮助:

首先,在某处定义这个类:

public class MicrosoftTeamUser
{
    public string Id { get; set; }

    public string ObjectId { get; set; }

    public string GivenName { get; set; }

    public string Surname { get; set; }

    public string Email { get; set; }

    public string UserPrincipalName { get; set; }

    public string TenantId { get; set; }
}

然后使用:

List<ChannelAccount> teamMembers = (await turnContext.TurnState.Get<IConnectorClient>().Conversations.GetConversationMembersAsync(
                turnContext.Activity.GetChannelData<TeamsChannelData>().Team.Id).ConfigureAwait(false)).ToList();

            List<MicrosoftTeamUser> teamsUsers = new List<MicrosoftTeamUser>();
            foreach (var item in teamMembers)
            {
                var teamsUser = JsonConvert.DeserializeObject<MicrosoftTeamUser>(item.Properties.ToString());
                teamsUser.Id = item.Id;
                teamsUsers.Add(teamsUser);
            }

然后您将在 teamMembers 变量中获得成员列表

【讨论】:

  • 感谢您的回答,但我特别需要连接到 api(或者我不知道,有什么方法可以删除或添加人员到使用 microsoft 团队的对话中?
  • @МаксШульдинер - Conversations.GetConversationMembersAsync 确实连接到 API。您是说您实际上想要添加/删除对话成员,而不仅仅是获取对话成员?如果是这样,那么您需要接受这个答案并提出一个新问题,因为那不是您提出的问题。
  • @Kyle Delaney 这适用于模拟器和天蓝色,但我不明白为什么它不适用于例如电报....
  • @Hilton Giesenow 你能帮我解决我上面的问题吗?
  • @МаксШульдинер - 你想在 Telegram 上做什么?您只是想使用Conversations.GetConversationMembersAsync 还是尝试添加/删除对话成员?当你说你在使用 Teams 时,你为什么要谈论 Telegram?对话操作自然是特定于频道的。例如,您是否希望更新活动适用于不支持消息更新的聊天服务?如果您对自己正在做的事情诚实,您将只能在您的问题上获得帮助。再次,请接受此答案并使用正确的详细信息提出新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 2019-08-10
  • 2020-03-02
  • 2021-11-08
相关资源
最近更新 更多