是否可以对多个Microsoft Bot使用相同的EndPoint
本文关键字:EndPoint Bot Microsoft 是否 | 更新日期: 2023-09-27 17:59:35
我正在尝试新的Microsoft Bot框架来构建Skype Bot。我想知道是否可以为几个Bot注册相同的EndPoint?
我看到了微软的例子,他们使用web.config来存储:
<add key="MicrosoftAppId" value="GUID" />
<add key="MicrosoftAppPassword" value="PASSWORD" />
并使用[BotAuthentication]
属性来解析所有内容。
如果同一个enddoing可以重复用于多个Bot,我应该如何处理身份验证?
感谢
多租户实现-可能的解决方案
将消息端点的路由更改为使用通配符,如下所示:
/// <summary>
/// POST: api/Messages
/// Receive a message from a user and reply to it
/// </summary>
[Route("messages/{*wildcard}")]
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
实现一个多租户bot身份验证属性,该属性将从最后一个url段中获取应用程序id(或从数据库中获取该id的查找)。
例如。http://localhost:3979/messages/your-机器人应用程序id或密钥
[MultiTentantBotAuthentication]
public class MessagesController : ApiController
{
实施
public class MultiTentantBotAuthenticationAttribute : BotAuthentication
{
public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
this.MicrosoftAppId = actionContext.Request.RequestUri.Segments.Last();
await base.OnAuthorizationAsync(actionContext, cancellationToken);
}
}
如果你需要你的机器人中的代码来知道它在哪个应用程序中运行,你可以通过用户数据传递它,比如:
/// <summary>
/// POST: api/Messages
/// Receive a message from a user and reply to it
/// </summary>
[Route("messages/{*wildcard}")]
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
var botId = Request.RequestUri.Segments.Last(); // Validate against your database / configuration
try
{
if (activity.Type == ActivityTypes.Message)
{
// https://docs.botframework.com/en-us/csharp/builder/sdkreference/stateapi.html
var stateClient = activity.GetStateClient();
BotData userData = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);
userData.SetProperty("ApplicationAccountBotId", botId);
await stateClient.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);
await Conversation.SendAsync(activity, () => actionDialog);
}
else
{
HandleSystemMessage(activity);
}
}
catch (Exception exception)
{
await logger.ErrorAsync(exception);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
然后,您可以访问对话框/机器人程序代码中的用户数据。
我可以为同一web服务(bot)和同一端点注册多个bot框架吗
如果这就是你的意思,答案是否定的,至少在Bot Builder SDK中不是这样。对于一个端点,您只能使用一组凭据。我认为在几个机器人注册中使用相同的Microsoft应用程序ID(和密码)没有问题,但目前不支持这样做。
你的用例是什么?你想为同一个机器人拥有多个频道标识(例如在Facebook上)?如果你真的需要,我相信你可以通过自己实现身份验证来实现这一点(而不是依赖SDK)。
更新
一个简单的解决方法是有多个端点,每个机器人一个,将工作委派给一个公共类。例如,您为Bot1注册/bot1/api/messages/
,为Bot2注册/bot2/api/messages
,每个控制器都使用具有给定机器人的appId和secret的BotAuthentication
属性。你可以这样使用属性:
[BotAuthentication(MicrosoftAppId="bot1AppId", MicrosoftAppPassword="bot1AppPwd")]
public class Bot1MessagesController : ApiController
...