ChatBot在Web模拟器中无法运行,但在Local Bot Framework模拟器中可以正常运行


9

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

有人知道如何解决吗?

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

在此处输入图片说明

使用源代码更新(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 Bot Services中不起作用


通过网络模拟器,您是指“在网络聊天中测试”功能?还是完整的网络聊天包/实现。是否将其托管在SharePoint页面/ webpart / spfx中?
Dana V

@DanaV,是的。Web模拟器位于Azure Web模拟器中,并且在另一个网页的Webchat中也使用了Directline。chatbot不在SharePoint页面上托管。
Eng Soon Cheah

Answers:


4

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

我注意到您的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应用服务混合连接功能会有所帮助。


更正,从内部SharePoint中检索数据。我应该在内部SharePoint中发布ChatBot吗?
Eng Soon Cheah

@EngSoonCheah,您好,它是基于谁会使用此bot的,如果它仅适用于您的内部网络用户,则从理论上讲,您可以将其发布到SharePoint网站的网络中。如果外部用户需要访问它,则应将其发布azure机器人服务,并使用Azure应用程序服务的混合连接功能(Azure机器人服务基于Azure应用程序服务)将您的机器人应用程序服务连接到本地站点。我认为该文档会有所帮助:azuregems.io/azure-hybrid-connections
Stanley Gong

嗨@EngSoonCheah,最近怎么样?您的问题解决了吗?
Stanley Gong

仍在尝试Azure混合连接。
Eng Soon Cheah

@EngSoonCheah,啊...我明白了。祝你好运,如果有任何更新,请让我知道:)
Stanley Gong

2

ChatBot似乎工作正常?它正在发送和接收消息。在本地运行和托管时,您拥有的某些代码的行为有所不同。有Xml,是文件还是生成的?您需要检查它是否与在本地运行时遵循相同的逻辑并使用相同的数据。也许如果您将某些(非机密)代码粘贴到崩溃的位置,我们可以提供更多帮助的建议


我已经更新了源代码。
Eng Soon Cheah,

错误从DispatchBot.cs的第136行开始。是哪条线?需要看这种方法ProcessRSSAsync的线136
WALEED

我已经更新了源代码,来自HttpWebResponse的LINE 136
Eng Soon Cheah

好。在本地看来,您可以很好地访问共享点RSS,但是在托管时,它不会返回相同的xml,这意味着它很可能会返回HTML错误页面。我搜索你的错误,并发现这一点: forums.asp.net/t/... 它会提示您可能需要使用代理服务器,请尝试在链接的代码示例
瓦利德

错误显示:System.PlatformNotSupportedException:该平台不支持该操作。
Eng Soon Cheah

2

当您发布漫游器时,将出现以下选项:

图片

选择编辑应用程序服务设置。仅添加以下详细信息,请勿添加其他任何内容:

MicrosoftAppId : <xxxxx>
MicrosoftAppPassword : <xxxxx>

单击应用,确定。

确保从appsettings.json中删除Microsoft App IdMicrosoft App Password,以便它也可以在bot模拟器中使用。

现在发布机器人。它在两个地方都可以使用。

希望这会有所帮助。


我只看到了“预览和配置”,因为我是从Azure门户下载ChatBot源代码的。
Eng Soon Cheah
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.