c# - 在部署的机器人上获得响应的问题;
问题描述
我在获取允许获取组成员的 REST API 响应时遇到了一些问题(GET {serviceUrl}/v3/conversations/{conversationId}/members)。我正在 Bot Emulator 中调试我的机器人,它在这里运行良好
主要问题是我真的无法识别问题。我知道问题出在请求中,因为 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();
解决方案
我不完全了解您的“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 变量中获得成员列表
推荐阅读
- asp.net - IIS 上的 ASP.NET 应用程序从内存中删除静态资源
- javascript - NodeJS 深度嵌套 json 比较不区分大小写的键/值对
- wordpress - 如何获取自定义字段值,如果它没有 echo identifier_exit?在 PHP 中
- javascript - 使用会话存储值并检索到其他页面
- java - hibernate SessionFactory.openSession() 是否等待池中的数据库连接可用
- python - 需要 DRF 错误用户名字段的 Djoser
- html - 如果元素具有相同的 z-index 值,如何相对定位元素?
- node.js - NVM node_modules 或安装位置
- informatica - 如何在 Informatica 云映射任务中运行动态查询?
- laravel - 在 Laravel 上实现“url”规则验证