是否有可能使用相同的端点几个微软机器人(Is it possible to use the same

2019-09-29 18:10发布

我想新的微软博特框架构建Skype的机器人。 我在想,如果有可能注册相同的端点几个机器人?

我看到了微软的例子,他们使用的web.config文件存储:

<add key="MicrosoftAppId" value="GUID" />
<add key="MicrosoftAppPassword" value="PASSWORD" />

并使用[BotAuthentication]属性来解决一切。

如果同一endpoing可以为多个机器人被重用,我应该如何处理身份验证?

谢谢

Answer 1:

多租户的实现 - 可能的解决方案

更改端点采取一个通配符,像这样的消息的途径:

    /// <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)
    {

实施将采取的应用程序ID从过去的网址片段(或查找从数据库中获取它)一个多租户BOT验证属性。

例如, HTTP://本地主机:3979 /消息/您的-BOT-APP-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);
    }

然后,您可以访问在一个对话框/ BOT代码的用户数据。



Answer 2:

我可以有相同的Web服务(BOT)和同一端点的多个BOT框架注册?

如果这是你的意思,答案是否定的,至少不会与机器人生成器SDK。 对于一个端点,你只能使用一组凭据。 我看不出有什么问题,使用相同的Microsoft应用程序ID(和密码)几BOT注册,但目前不支持此操作。

什么是你的使用情况? 你想拥有多个频道标识(例如,在Facebook上)对同一机器人? 如果你真的需要这一点,我相信你可以通过实施身份验证自己(而不是依靠SDK针对此)实现这一目标。

UPDATE

一个简单的解决方法是让多个端点,每个机器人,将这项工作委托给一个普通类。 如您注册/bot1/api/messages/为Bot1和/bot2/api/messages的Bot2,使用每个控制器BotAuthentication与给定机器人的应用标识和秘密属性。 您可以使用像这样的属性:

[BotAuthentication(MicrosoftAppId="bot1AppId", MicrosoftAppPassword="bot1AppPwd")]
public class Bot1MessagesController : ApiController
...


文章来源: Is it possible to use the same EndPoint for several Microsoft Bots