如何在使用Bot Framework V4 C#SDK的团队中迁移1:1主动消息功能

如何在使用Bot Framework V4 C#SDK的团队中迁移1:1主动消息功能,c#,migration,botframework,microsoft-teams,proactive,C#,Migration,Botframework,Microsoft Teams,Proactive,我有一个Bot Framework V3 SDK实现(工作正常),可以使用Microsoft Team Bot(安装在同一个团队中)与特定团队中的任何用户启动1:1私人聊天。 我在尝试将其迁移到V4 SDK时遇到问题 我读过很多文章和其他问题,除非用户首先联系机器人(以避免向用户发送垃圾邮件),否则不可能做到这一点,但V3版本不是这样,我需要的功能也不是这样 原始解决方案使用Microsoft.Bot.Connector.Teams程序集中的“CreateOrGetDirectConversat

我有一个Bot Framework V3 SDK实现(工作正常),可以使用Microsoft Team Bot(安装在同一个团队中)与特定团队中的任何用户启动1:1私人聊天。 我在尝试将其迁移到V4 SDK时遇到问题

我读过很多文章和其他问题,除非用户首先联系机器人(以避免向用户发送垃圾邮件),否则不可能做到这一点,但V3版本不是这样,我需要的功能也不是这样

原始解决方案使用Microsoft.Bot.Connector.Teams程序集中的“
CreateOrGetDirectConversation
”扩展方法,但在该程序集的V4版本中不可用

我尝试使用
CreateDirectConversation
/
CreateDirectConversationAsync
方法,但没有成功(它们总是导致“错误请求”错误)

这是使用V3库实际运行的代码:

//创建1:1对话
var conversation=connectorClient.Conversations.CreateOrGetDirectConversation(botAccount、user、tenantId);
//向用户发送消息
var message=Activity.CreateMessageActivity();
message.Type=ActivityTypes.message;
message.Text=“我的消息”;
connectorClient.Conversations.SendToConversation((活动)消息,conversation.Id);
我发现很难迁移。我遗漏了什么吗?

根据文件:

机器人程序可以创建与单个Microsoft team用户的新对话,只要您的机器人程序在个人、groupChat或团队范围内具有通过先前添加获得的用户信息。此信息使您的机器人能够主动通知他们。例如,如果您的机器人被添加到团队中,它可以查询团队名册并在个人聊天中向用户发送个人消息,或者用户可以@提及另一个用户以触发机器人向该用户发送直接消息

注意:V4的扩展仍在预发布中,这就是为什么很难找到它的示例和代码的原因

添加中间件 在
Startup.cs
中:

var-credentials=新的SimpleCredentialProvider(配置[“MicrosoftAppId”]、配置[“MicrosoftAppPassword”]);
服务。AddSingleton(凭证);
[...]
services.AddBot(选项=>
{
options.CredentialProvider=凭证;
options.Middleware.Add(
新团队管理软件(
新的ConfigurationCredentialProvider(this.Configuration));
[...]
准备你的机器人 在主
.cs
中:

private readonly SimpleCredentialProvider\u credentialProvider;
[...]
公共(会话状态会话状态,SimpleCredentialProvider CredentialProvider)
{
_credentialProvider=credentialProvider;
[...]
发送消息
var teamConversationData=turnContext.Activity.GetChannelData();
var connectorClient=new connectorClient(新Uri(activity.ServiceUrl)、\u credentialProvider.AppId、\u credentialProvider.Password);
var userId=;
var tenantId=teamConversationData.Tenant.Id;
var参数=新的ConversationParameters
{
Members=new[]{new ChannelAccount(userId)},
ChannelData=新团队SchannelData
{
租户=新租户信息(租户信息),
},
};
var conversationResource=await connectorClient.Conversations.CreateConversationAsync(参数);
var message=Activity.CreateMessageActivity();
message.Text=“这是一条主动消息。”;
等待connectorClient.Conversations.SendToConversationAsync(conversationResource.Id,(活动)消息);
注意:如果需要获取用户ID,可以使用:

var members=(等待turnContext.TurnState.Get().Conversations.GetConversationMembersSync(
Activity.GetChannelData().Team.Id).ConfigureAwait(false)).ToList();
此外,我在测试中不需要这个,但如果您出现401个错误,您可能需要:

MicrosoftAppCredentials.TrustServiceUrl(turnContext.Activity.ServiceUrl);

资源

您好,谢谢您的回答。serviceUrl是可信的,并且安装了Teams V4 NuGet软件包,但是您的代码给了我以下错误:“'IConversations'不包含'CreateOrGetDirectConversation'的定义,并且找不到可访问的扩展方法'CreateOrGetDirectConversation'接受'IConversations'类型的第一个参数(是否缺少using指令或程序集引用?)”我引用的是Microsoft.Bot.Builder.Team(4.3.0)和Microsoft.Bot.Connector.Teams(4.3.0)@GiorgioNobili我很抱歉!我链接到了错误的NuGet软件包。更新了答案。我也没有意识到,尽管这些文档最近正在更新,但它们仍然使用V3中的代码。演示了如何进行主动消息传递。一旦我可以简化它,我将更新我的答案。很抱歉延迟,但我直到今天才能看到您的更新…以及它工作得很好!正如您所说,文档目前还不太清楚,所以非常感谢您的支持。