首页 > 解决方案 > 在部署的机器人上获得响应的问题;

问题描述

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

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

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

主要问题是我真的无法识别问题。我知道问题出在请求中,因为 getResponse 方法在服务器上时会导致所有程序崩溃(但为什么这在机器人模拟器中有效?)。这是代码(我正在使用 .NET CORE、Microsoft Bot Framework)。授权中的 PS{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();

标签: c#jsonrestapibotframework

解决方案


我不完全了解您的“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 变量中获得成员列表


推荐阅读