ChatBot 从 SharePoint On Premise Issue 检索数据

ChatBot retrieve data from SharePoint On Premise Issue

我开发了一个与 SharePoint on Premise 通信的聊天机器人,

当我 运行 模拟器中的聊天机器人正常工作时。

但是当我 运行 在 SharePoint 外部托管的 Web 上时,它不起作用。

这是我在 Azure 上出错的截图,错误的结果是从 XMLReader 和 SyndicationFeed 开始

本地模拟器成功

这是我的源代码。

 private async Task ProcessRSSAsync(ITurnContext<IMessageActivity> turnContext, LuisResult luisResult, string intent, CancellationToken cancellationToken)
        {
            var questionluis = turnContext.Activity.Text;

            await turnContext.SendActivityAsync("intent recognize" + intent);

            var intentresut = intent;
            await turnContext.SendActivityAsync("Get LUIS Entity");
            await turnContext.SendActivityAsync(string.Join("\t", luisResult.Entities.Select((entityObj) => entityObj.Entity)));
            var entityfound = string.Join("\t", luisResult.Entities.Select((entityObj) => entityObj.Entity));

            string spxurl = @"https://intra.aspac.com/sites/sg/daw/_layouts/15/srchrss.aspx?k=*%20ListId:7BC0F2C3-6366-48B8-B88A-8738BE1F9C31";

            await turnContext.SendActivityAsync("Intent: " + intent.ToString() + " Entity: " + entityfound.ToString());
            ////---------------------------------------------------------------------------------------------
            //22112019
            try
            {

                //#ES09122019
                var credentials = new NetworkCredential("email@example.com", "Pa$$w0rd", "sg.kworld.com");

                var handler = new HttpClientHandler { Credentials = credentials, UseDefaultCredentials = false };
                var client = new HttpClient(handler);

                client.BaseAddress = new Uri("https://intra.aspac.com/sites/sg/daw/");

                HttpResponseMessage resp = client.GetAsync("_layouts/15/srchrss.aspx?k=" + entityfound + "*%20ListId:7BC0F2C3-6366-48B8-B88A-8738BE1F9C31").Result;

                string respString = resp.Content.ReadAsStringAsync().Result;


                if (resp.StatusCode == HttpStatusCode.OK)
                {
                    await turnContext.SendActivityAsync("Connected");

                    //Success 06122019 .
                    try
                    {
                        string spurl = @"https://intra.aspac.com/sites/sg/daw/_layouts/15/srchrss.aspx?k=*%20ListId:7BC0F2C3-6366-48B8-B88A-8738BE1F9C31";
                        XmlSecureResolver resolver = new XmlSecureResolver(new XmlUrlResolver(), spurl);
                        resolver.Credentials = new NetworkCredential("email@example.com.sg", "Pa$$w0rd", "sg.kworld.com"); 

                        XmlReaderSettings settings = new XmlReaderSettings();
                        settings.DtdProcessing = DtdProcessing.Parse;
                        settings.ValidationType = ValidationType.DTD;

                        settings.XmlResolver = resolver;



                        XmlReader reader = XmlReader.Create(spurl, settings);

                        SyndicationFeed feed = SyndicationFeed.Load(reader);

                        reader.Close();

                        var attachments = new List<Attachment>();
                        foreach (SyndicationItem item in feed.Items)
                        {
                            //Get Title,Description,URL
                            String title = item.Title.Text;
                            String description = item.Summary.Text;
                            String link = item.Links.FirstOrDefault().Uri.ToString();

                            //Hero Card
                            var heroCard = new HeroCard(
                                title: item.Title.Text,
                                // subtitle: description,
                                buttons: new CardAction[]
                                {
                         new CardAction(ActionTypes.OpenUrl,"Learn More",value:link)
                                }
                                ).ToAttachment();
                            attachments.Add(heroCard);

                        }
                        var reply = MessageFactory.Carousel(attachments);
                        await turnContext.SendActivityAsync(reply);
                        await ProcessCosmoDBStorageLUISAsync(turnContext, questionluis, intent, entityfound, respString, cancellationToken);
                    }
                    catch (Exception ex)
                    {
                        await turnContext.SendActivityAsync(ex.ToString());
                    }

                }
            }

            catch (Exception ex)
            {
                await turnContext.SendActivityAsync("Sorry,Currently Server Under Maintenace");
                await turnContext.SendActivityAsync(ex.ToString());
            }

        }

对此有什么解决方案和建议吗?

我在使用本地数据库时遇到了类似的问题。当您在外部部署机器人时,机器人需要 Internet 上可用的资源,而不是内部包含的资源。使用 bot 模拟器可以正常工作,因为它可以访问您的机器。

也就是说,azure 已经开发了一些可以用来帮助解决这个问题的操作。如果您查看应用程序代理,那可能会帮助您。

我想这就是你的意思...无论如何!

好的,我想我终于更好地理解了这一点,所以希望能把一个有用的回复放在一起。如果我们有一个共享的白板会容易得多:-)

基本上,就在 Microsoft Bot Framework Services 上托管机器人而言,您需要在 Azure 中进行注册。但是,有两种不同的选择,并且两者在托管方面有很大不同。当您 "create" Azure 中的资源并搜索 "Bot" 时,您将看到两个选项 - "Web App Bot" 和 "Bot Channels Registration":

  1. "Bot Channels Registration" 表示仅在 Azure 中注册您的机器人,但将其托管在其他地方。
  2. "Web App Bot" - 包括 "Bot Channels Registration" 但也使用 Azure Web 应用程序添加托管(因此它是 Bot 注册 PLUS 托管)

从您发布的屏幕截图中,我可以看到您选择了上面的 (2),因此您的机器人 运行正在 Azure 中,因此可以'连接到您的本地资源 (SharePoint)。

因此,我建议以下两个选项之一:

  1. 特别创建一个Azure Application Proxy - this is basically a small gateway so that your bot HOSTED in Azure can securely talk to your on-premises SharePoint. There is in fact a specific use case for SharePoint

  2. 删除并重新创建您的 Azure Bot 条目,使其只是一个 "Bot Channels Registration",然后在 "Settings" 屏幕中您可以调用托管在任何 "https"端点。然后,您可以在本地网络 运行 上安装您的机器人 ,但它需要一个实时 "https" 地址(这并不难,但您有让您的 IT 团队参与获取实时网址,例如 "whatever.aspac.com",您需要一个 SSL/TLS 证书,以便它可以 运行 httpS 而不仅仅是 http。

您选择哪个选项可能取决于您的团队以及组织的技能和资源。例如,公司可能已经配置了 Azure 应用程序代理,在这种情况下可以节省大量工作。它可能有一个通配符证书,这将使选项 (2) 更容易等。

无论如何,我希望对您有所帮助,但如果仍有任何不清楚的地方,请随时询问更多。