继续主动创建对话的问题

问题描述 投票:2回答:1

我已经能够使用下面的代码主动启动一个自适应卡的对话框。

[HttpGet]
    [Route("proactivetest")]
    public async Task ProactiveTest()
    {
        try
        {
            await _frameworkAdapter.CreateConversationAsync(
                TeamsChannelId,
                ServiceUrl,
                new MicrosoftAppCredentials(MicrosoftAppId, MicrosoftAppPassword),
                new ConversationParameters(true, null, null, string.Empty,
                    new Activity(
                        type: ActivityTypes.Message,
                        text: "test",
                        serviceUrl: ServiceUrl,
                        channelId: TeamsChannelId
                        ),
                    new Dictionary<string, string> { ["teamsChannelId"] = TeamsChannelId }),
                Callback, default);
        }
        catch(Exception Ex)
        {
            Console.WriteLine($"Exception: {Ex.Message}");
        }
    }

    public async Task Callback(ITurnContext turnContext, CancellationToken cancellationToken)
    {
        DialogContext dialogContext = await _DialogSet.CreateContextAsync(turnContext, cancellationToken);

        await dialogContext.BeginDialogAsync(nameof(AdaptiveCardTests), null, cancellationToken);

        await _Accessors.ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);

        return;
    }

但是当用自适应卡中的值进行回复时,我无法继续对话。我尝试从DialogSet中创建一个DialogContext,但它总是返回DialogContext["null"],然后运行一个新的对话框。

        protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
    {
        DialogContext dialogContext = await _DialogSet.CreateContextAsync(turnContext, cancellationToken);

        if (dialogContext.ActiveDialog != null)   
        {
            await dialogContext.ContinueDialogAsync(cancellationToken);
            return;
        }

        _Logger.LogInformation("Running dialog with Message Activity.");
        await dialogContext.BeginDialogAsync(nameof(AdaptiveCardTests), null, cancellationToken);
    }

如果你然后回复这个新的对话框,上述代码就能正常工作,并按预期继续对话。

如果能得到任何帮助,我将非常感激。

c# botframework microsoft-teams
1个回答
3
投票

你可以看看这个文档 主动向用户发送通知. 也可以看一下 C#示例 主动留言代码


0
投票

我已经能够解决这个问题,BotFrameworkAdapter.CreateConversationAsync()的channelId参数需要设置为 "msteams",而不是我原来设置的Teams Channel Id。

下面是更新后的代码,工作正常。

[HttpGet]
    [Route("proactivetest")]
    public async Task ProactiveTest()
    {
        try
        {
            await _frameworkAdapter.CreateConversationAsync(
                "msteams",
                ServiceUrl,
                new MicrosoftAppCredentials(MicrosoftAppId, MicrosoftAppPassword),
                new ConversationParameters(true, new ChannelAccount($"28:{MicrosoftAppId}", BotName, null, null), null, string.Empty,
                    new Activity(
                        type: ActivityTypes.Message,
                        text: "test",
                        serviceUrl: ServiceUrl,
                        channelId: "msteams"
                        ),
                    new Dictionary<string, string> { ["teamsChannelId"] = TeamsChannelId }),ProactiveCallback, default);
        }
        catch(Exception Ex)
        {
            Console.WriteLine($"Exception: {Ex.Message}");
        }
    }

    public async Task ProactiveCallback(ITurnContext turnContext, CancellationToken cancellationToken)
    {
        DialogContext dialogContext = await _DialogSet.CreateContextAsync(turnContext, cancellationToken);

        await dialogContext.BeginDialogAsync(nameof(AdaptiveCardTests), null, cancellationToken);

        await _Accessors.ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
    }
© www.soinside.com 2019 - 2024. All rights reserved.