【问题标题】:ChatBot retrieve data from SharePoint On Premise IssueChatBot 从 SharePoint On Premise Issue 检索数据
【发布时间】:2020-01-13 14:11:51
【问题描述】:

我开发了一个与 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());
            }

        }

对此有何解决方案和建议?

【问题讨论】:

  • 这个机器人实际在哪里运行?在与 SharePoint 实例相同的网络上?
  • @HiltonGiesenow 机器人应该在网页和同一网络上运行,而不是在 SharePoint 页面内运行。有更好的建议吗?谢谢。

标签: sharepoint botframework azure-bot-service


【解决方案1】:

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

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

  1. “机器人频道注册”意味着只需在 Azure 中注册您的机器人,但将其托管在其他地方。
  2. “Web App Bot” - 包括“Bot Channels Registration”,但还使用 Azure Web 应用程序添加托管(因此它是 Bot 注册 PLUS 托管)

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

因此,我建议以下两种选择之一:

  1. 创建一个Azure Application Proxy - 这基本上是一个小型网关,以便您在 Azure 中托管的机器人可以安全地与您的本地 SharePoint 对话。其实特别是a specific use case for SharePoint

  2. 删除并重新创建您的 Azure Bot 条目,改为只是“机器人通道注册”,然后在“设置”屏幕中,您可以调用托管在任何“https”端点的机器人。然后,您可以让您的机器人在本地网络上运行,但它需要一个实时的“https”地址(这并不难,但您必须让您的 IT 团队参与进来网址,例如“whatever.aspac.com”,并且您需要 SSL/TLS 证书,以便它可以运行 httpS 而不仅仅是 http。

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

无论哪种方式,我希望这会有所帮助,但如果还有什么不清楚的地方,请随时询问。

【讨论】:

  • 对于选项2,这意味着我的源代码(机器人应用程序)需要托管在服务器上?
  • 是的,它应该可以正常工作,因为机器人将再次在本地网络上运行,它可以访问 SharePoint。一个非常简单的测试方法是在你的本地机器上运行机器人,并使用免费的 Ngrok 工具——它会给你一个临时的“真实”https地址,你可以在机器人频道注册中使用它。执行此操作时不要忘记检查 url - 我有时忘记在地址中添加“/api/” - 它应该类似于 xyz.ngrok.io/api/messages
  • 顺便说一句,另一件单独的事情 - 对于你在 Azure 中创建的机器人,只需检查帐单 - 我创建的第一个机器人也是使用“网络应用”机器人模板,一个即用即付计划,当我只使用它几天时,不小心在一个月内产生了 70 美元的账单,真是一种可悲的浪费。
  • @EngSoonCheah 你在这方面有什么进展吗?
  • 是在运行“npx serve”吗?在我运行 npx 服务器后:本地:localhost:5000 和在您的网络上:http:10.X.X.47:5000,我应该输入 http:10.x.x。 47:5000/api/消息?我需要等待我的 IT 人员假期回来,以便我可以将我的 Bot API/消息托管到服务器。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2019-04-12
    • 2022-07-26
    相关资源
    最近更新 更多