1

我正在尝试使用直线将 UWP 应用程序与 Bot 框架集成,但 bot 框架网站向我显示此错误:“HTTP 状态代码 InternalServerError”,所以我尝试调试,经过研究,我发现错误在“发送一个机器人的活动”部分,但我不知道如何修复它。(如果我用bot模拟器测试,它可以工作,是否意味着bot没有任何问题?)

namespace BotClient
{
    public sealed partial class MainPage : Page
    {
        BotService myBot;
        string ConversationId;
        public MainPage()
        {
            this.InitializeComponent();
            myBot = new BotService();       
        }      
        private async void btnAsk_Click(object sender, RoutedEventArgs e)
        {
            string msg = txtInput.Text;
            ConversationId = await myBot.StartConversation("Bearer KNEkUE8KsPg.cwA.28g.gw6z3bjzRutZID4T2xDAp0XYnCb7mTysJV53rbivy0s");
            await myBot.SendMessage(msg);           
                ConversationActitvities messages = await myBot.GetMessages();
                for (int i = 1; i < messages.activities.Length; i++)
                {
                    lblMessage.Text += messages.activities[i].text + Environment.NewLine;
                }            
        }

    }
}


namespace BotFrameworkTestClient
{

    class Conversation
    {
        public string conversationId { get; set; }
        public string token { get; set; }
        public string eTag { get; set; }
        public string expires_in { get; set; }
    }

    public class ConversationReference
    {
        public string id { get; set; }
    }

    public class ConversationActitvities
    {
        public Activity[] activities { get; set; }
        public string watermark { get; set; }
        public string eTag { get; set; }
    }

    public class UserId
    {
        public string id { get; set; }
        public string name { get; set; }
    }

    public class ActivityReference
    {
        public string id { get; set; }
    }

    public class ActivityMessage
    {
        public string type { get; set; }
        public UserId from { get; set; }
        public string text { get; set; }
    }

    public class Activity : ActivityMessage
    {
        public string id { get; set; }
        public DateTime timestamp { get; set; }
        public ConversationReference conversation { get; set; }

        public string channelId { get; set; }
        public string replyToId { get; set; }
        public DateTime created { get; set; }
        public Channeldata channelData { get; set; }
        public string[] images { get; set; }
        public Attachment[] attachments { get; set; }
        public string eTag { get; set; }
    }

    public class Channeldata
    {
    }

    public class Attachment
    {
        public string url { get; set; }
        public string contentType { get; set; }
    }

    class KeyRequest
    {
        public string Mainkey { get; set; }
    }
    public class BotService
    {

        private string APIKEY;
        private string botToken;
        private string activeConversation;
        private string activeWatermark;
        private string newActivityId;
        private string lastResponse;
        public BotService()
        {
            // Constructor
        }
        public async Task<string> StartConversation(string secret)
        {
            //APIKEY = secret;          
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("https://directline.botframework.com/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                // Authorize
                //client.DefaultRequestHeaders.Add("Authorization", "Bearer " + APIKEY);
                client.DefaultRequestHeaders.Add("Authorization", secret);

                // Get a new token as dummy call
                var keyreq = new KeyRequest() { Mainkey = "" };
                var stringContent = new StringContent(keyreq.ToString());
                HttpResponseMessage response = await client.PostAsync("v3/directline/conversations", stringContent);
                if (response.IsSuccessStatusCode)
                {
                    var re = response.Content.ReadAsStringAsync().Result;
                    var myConversation = JsonConvert.DeserializeObject<Conversation>(re);
                    activeConversation = myConversation.conversationId;
                    botToken = myConversation.token;
                    return myConversation.conversationId;
                }
            }
            return "Error";
        }

        public async Task<bool> SendMessage(string message)
        {
            using (var client = new HttpClient())
            {
                string conversationId = activeConversation;

                client.BaseAddress = new Uri("https://directline.botframework.com/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                // Authorize
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + botToken);

                // Send a message
                string messageId = Guid.NewGuid().ToString();
                DateTime timeStamp = DateTime.Now;
                var attachment = new Attachment();
                var myMessage = new ActivityMessage()
                {
                    type = "message",
                    from = new UserId() { id = "Joe" },
                    text = message
                };
                string postBody = JsonConvert.SerializeObject(myMessage);
                String urlString = "v3/directline/conversations/" + conversationId + "/activities";
                HttpContent httpContent = new StringContent(postBody, Encoding.UTF8, "application/json");
                HttpResponseMessage response = await client.PostAsync(urlString, httpContent);
                if (response.IsSuccessStatusCode)
                {
                    var re = response.Content.ReadAsStringAsync().Result;
                    lastResponse = re;
                    var ar = JsonConvert.DeserializeObject<ActivityReference>(re);
                    newActivityId = ar.id;
                    return true;
                }
                else
                {
                    lastResponse = response.Content.ReadAsStringAsync().Result;
                }
                return false;
            }
        }
        public async Task<string> GetNewestActivity()
        {
            ConversationActitvities cm = await GetNewestActivities();
            if (cm.activities.Length > 0)
            {
                return cm.activities[cm.activities.Length - 1].text;
            }
            else
            {
                return "";
            }
        }
        public async Task<ConversationActitvities> GetNewestActivities()
        {
            await Task.Delay(TimeSpan.FromMilliseconds(200)).ConfigureAwait(true);
            int inc = 0;
            ConversationActitvities cm = await GetMessages();
            while (++inc < 5)
            {
                Debug.WriteLine(cm.activities.Length + "conversations received");
                for (int i = 0; i < cm.activities.Length; i++)
                {
                    var activity = cm.activities[i];
                    Debug.WriteLine("activity received = " + activity.text);
                    lastResponse = activity.id + " / " + activity.replyToId + " / " + newActivityId;

                    // wait for reply message from my message
                    if (activity.replyToId != null && activity.replyToId.Equals(newActivityId))
                    {
                        Debug.WriteLine("activity is response to " + newActivityId);
                        return cm;
                    }
                }
                await Task.Delay(TimeSpan.FromMilliseconds(5)).ConfigureAwait(true);
                cm = await GetMessages();
            }
            return cm;
        }
        public async Task<ConversationActitvities> GetMessages()
        {
            using (var client = new HttpClient())
            {
                string conversationId = activeConversation;

                client.BaseAddress = new Uri("https://directline.botframework.com/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                // Authorize
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + botToken);

                ConversationActitvities cm = new ConversationActitvities();
                string messageURL = "v3/directline/conversations/" + conversationId + "/activities";
                if (activeWatermark != null)
                    messageURL += "?watermark=" + activeWatermark;
                HttpResponseMessage response = await client.GetAsync(messageURL);
                if (response.IsSuccessStatusCode)
                {
                    var re = response.Content.ReadAsStringAsync().Result;
                    lastResponse = re.ToString();
                    cm = JsonConvert.DeserializeObject<ConversationActitvities>(re);
                    activeWatermark = cm.watermark;
                    return cm;
                }
                return cm;
            }
        }
    }
}

在此处输入图像描述

4

0 回答 0