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

时间:2019-12-06 00:49:42

标签: botframework sharepoint-2013 azure-bot-service direct-line-botframework

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

有人知道如何解决吗?

这里是我的截图。 左侧来自Web模拟器,右侧来自本地Bot Framework模拟器

enter image description here

使用源代码更新(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://intra.aspac.kpmg.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中托管。

3 个答案:

答案 0 :(得分:3)

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

我注意到您的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 App Service Hybrid Connections feature会有所帮助。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

发布机器人时,将显示以下选项:

Image

选择“编辑应用程序服务设置”。仅添加以下详细信息,无需添加其他内容:

            <GiftedChat
              renderInputToolbar={this.renderInputToolbar}
              renderUsernameOnMessage={true}
              renderBubble={this.renderBubble}
              renderSend={this.renderSend}
              renderTime={this.renderTime}
              renderAvatarOnTop={true}
              renderMessageImage={this.renderMessageImage}
              scrollToBottom={true}
              messages={this.state.messages}
              onSend={messages => this.onSend(messages)}
              onPressAvatar={user => this.onPressAvatar(user)}
              user={{
                _id: this.props.screenProps.userName,
                name: this.props.screenProps.userName,
                avatar: this.props.screenProps.userImage
              }}
            />

点击“应用”,确定。

确保从appsettings.json中删除MicrosoftAppId : <xxxxx> MicrosoftAppPassword : <xxxxx> Microsoft App Id,以便它也可以在bot模拟器中使用。

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

希望这会有所帮助。