首页 > 解决方案 > ChatBot 在 Web Emulator 中不起作用,但在 Local Bot Framework 仿真器中运行良好

问题描述

我开发了与 SharePoint On Premise 集成的 ChatBot。当我在模拟器中调试 ChatBot 时,它可以工作。但是,当我使用 DirectLine 在 Azure 中的 Web 模拟器和托管在公司网站中的网站上进行调试时,它不起作用。

有谁知道如何解决它?

附上我的截图。左侧来自 Web Emulator,右侧来自本地 Bot Framework Emulator

在此处输入图像描述

更新源代码(2019 年 12 月 9 日)

XmlNamespaceManager xmlnspm = new XmlNamespaceManager(new NameTable());

Uri sharepointUrl = new Uri("https://mvponduty.sharepoint.com/sites/sg/daw/");

xmlnspm.AddNamespace("atom", "http://www.w3.org/2005/Atom");
xmlnspm.AddNamespace("d", "http://schemas.microsoft.com/ado/2007/08/dataservices");
xmlnspm.AddNamespace("m", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata");

NetworkCredential cred = new System.Net.NetworkCredential("engsooncheah@mvponduty.onmicrosoft.com", "Pa$$w0rd", "mvponduty.onmicrosoft.com");

HttpWebRequest listRequest = (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + "_api/lists/getByTitle('" + "data@work" + "')/items?$filter=Keywords%20eq%20%27bloomberg%27");
listRequest.Method = "GET";
listRequest.Accept = "application/atom+xml";
listRequest.ContentType = "application/atom+xml;type=entry";

listRequest.Credentials = cred;
//LINE 136 start from below
HttpWebResponse listResponse = (HttpWebResponse)listRequest.GetResponse();
StreamReader listReader = new StreamReader(listResponse.GetResponseStream());
XmlDocument listXml = new XmlDocument();

listXml.LoadXml(listReader.ReadToEnd());

if (listResponse.StatusCode == HttpStatusCode.OK)
{
    Console.WriteLine("Connected");
    await turnContext.SendActivityAsync("Connected");
}

// Get and display all the document titles.
XmlElement root = listXml.DocumentElement;
XmlNodeList elemList = root.GetElementsByTagName("content");
XmlNodeList elemList_title = root.GetElementsByTagName("d:Title");
XmlNodeList elemList_desc = root.GetElementsByTagName("d:Description");

//for LINK
XmlNodeList elemList_Id = root.GetElementsByTagName("d:Id");
XmlNodeList elemList_Source = root.GetElementsByTagName("d:Sources");
XmlNodeList elemList_ContentTypeId = root.GetElementsByTagName("d:ContentTypeId");

var attachments = new List<Attachment>();
for (int i = 0; i < elemList.Count; i++)
{

    string title = elemList_title[i].InnerText;
    string desc = elemList_desc[i].InnerText;

    string baseurllink = "https://mvponduty.sharepoint.com/sites/sg/daw/Lists/data/DispForm.aspx?ID=";
    string LINK = baseurllink + elemList_Id[i].InnerText + "&Source=" + elemList_Source[i].InnerText + "&ContentTypeId=" + elemList_ContentTypeId[i].InnerText;

    //// Hero Card
    var heroCard = new HeroCard(
        title: title.ToString(),
        text: desc.ToString(),

        buttons: new CardAction[]
        {
            new CardAction(ActionTypes.OpenUrl,"LINK",value:LINK)
        }
    ).ToAttachment();
    attachments.Add(heroCard);
}
var reply = MessageFactory.Carousel(attachments);
await turnContext.SendActivityAsync(reply);

2019 年 12 月 17 日更新

我曾尝试使用嵌入式和直线。但错误仍然相同。

Bot 未托管在 SharePoint 中。

2020 年 1 月 6 日更新 它在 Azure 机器人服务中不起作用

标签: botframeworksharepoint-2013azure-bot-servicedirect-line-botframework

解决方案


根据您的描述,您可以在本地从中获取数据。这意味着您的代码和逻辑都没有问题。

我注意到您的 sharePoint URL 是 :https://mvponduty.sharepoint.com/sites/sg/daw/并且我尝试访问它,并且还尝试访问您的整个请求 URL :https://mvponduty.sharepoint.com/sites/sg/daw/_api/lists/getByTitle('data@work')/items?$filter=Keywords eq 'bloomberg'两者的响应都是 404。

你说这是一个本地站点,所以你能检查一下这个站点是否可以从公共网络访问?

我假设当您在本地测试代码时,您可以像在内部网络中一样访问该站点,从而能够访问本地站点。但是,当您将代码发布到 Azure 时,它​​不再在您的内部工作中:它位于公共网络中,因此无法访问导致此错误的本地 sharePoint 站点。

众所周知,机器人代码托管在 Azure 应用服务上,如果此错误是由上述原因引起的,那么Azure 应用服务混合连接功能可能会在这种情况下有所帮助。


推荐阅读