1

新しい Microsoft Bot Framework を使用して Skype Bot を構築しようとしています。複数のボットに同じエンドポイントを登録することは可能でしょうか?

Microsoft の例を見たところ、web.config を使用して次のものを保存しています。

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

そして、[BotAuthentication]属性を使用してすべてを解決します。

同じエンドポイントを複数のボットで再利用できる場合、認証をどのように処理すればよいですか?

ありがとう

4

2 に答える 2

2

マルチテナントの実装 - 考えられる解決策

メッセージ エンドポイントのルートを次のようにワイルドカードを使用するように変更します。

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

最後の URL セグメント (またはデータベースから取得するルックアップ) からアプリケーション ID を取得するマルチテナント ボット認証属性を実装します。

例: http://localhost:3979/messages/your-bot-app-id-or-key

[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);
    }

その後、ダイアログ/ボット コードでユーザー データにアクセスできます。

于 2016-08-11T05:30:31.030 に答える