使用 Directline 在 WinForm 与我现有的 Azure Bot 集成中遇到问题 API

Facing Issues in WinForm Integration with my Existing Azure Bot Using Directline API

我使用 Bot Framework SDK(C#、.Net)创建了一个机器人。我已经在 Azure 中发布了它。它在 WebChat 和 Teams 频道中运行良好。现在我想创建一个 Winform 并尝试使用 Directline Api.

将 Winform UI 连接到我的机器人

这是我的代码:

public 部分 class Form1 : 表格 {

    private static string directLineSecret = ConfigurationSettings.AppSettings["DirectLineSecret"];

    private static string botId = ConfigurationSettings.AppSettings["BotId"];

    private static string fromUser = "User";
    private static string id = "default-user";

    private Conversation conversation;
    DirectLineClient directLineClient = null;
    

    public Form1()
    {
        InitializeComponent();
        InitClientAsync();

    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }
    private async Task InitClientAsync()
    {
        directLineClient = new DirectLineClient($"{directLineSecret}");
        directLineClient.BaseUri = new Uri($"https://directline.botframework.com/");

        //directLineClient = new DirectLineClient(directLineSecret);
        conversation = await directLineClient.Conversations.StartConversationAsync().ConfigureAwait(false);

            new System.Threading.Thread(async () => await ReadBotMessageAsync(directLineClient, conversation.ConversationId)).Start();
        
    }

    private async Task ReadBotMessageAsync(DirectLineClient client, string conversationId)
    {
        string watermark = null;

        while(true)
        {
            var activitySet = await client.Conversations.GetActivitiesAsync(conversationId, watermark);
            watermark = activitySet?.Watermark;

            var activities = from x in activitySet.Activities where x.From.Id == botId select x;

            foreach(Activity activity in activities)
            {
                if(activity.Text != null)
                {
                    string message = activity.Text;
                    if(InvokeRequired)
                    {
                        BeginInvoke(new MethodInvoker(delegate
                        {
                            textBox.AppendText("Bot : " + message + "\r\n");
                        }));
                    }
                    
                }
            }
        }
    }

    private async void btn_Send_Click(object sender, EventArgs e)
    {
        string input = txt_Send.Text;
        txt_Send.Clear();
        if(input.Length>0)
        {
            Activity userMessage = new Activity
            {
                From = new ChannelAccount(id, fromUser),
                Text = input,
                Type = ActivityTypes.Message,
                TextFormat = "plain"
            };
            textBox.AppendText("You : " + input + "\r\n");
            await directLineClient.Conversations.PostActivityAsync(this.conversation.ConversationId, userMessage);
        }
    }
}

但是当我执行程序时,它在尝试获取对话和对话 ID 时由于空引用异常而停止。

您可以在此处查看 error image。

任何人都可以告诉我我在这里缺少什么吗? 任何帮助将不胜感激.....

问题出在直线密钥上。我重新生成了一个新密钥并使用了它。现在开始对话,我可以看到对话 ID。

但之后我收到状态代码 429 错误。那基本上是多线程问题。它试图同时创建多个线程。 然后我使用 .Net Framework 4.6.2 版(以前使用 4.7)重新创建整个项目。现在那个问题也解决了。项目运行良好。