web-dev-qa-db-fra.com

ChatBot ne fonctionnait pas dans l'émulateur Web mais fonctionnait bien dans l'émulateur Local Bot Framework

J'ai développé le ChatBot qui s'intègre à SharePoint On Premise. Lorsque je débogue le ChatBot dans l'émulateur, cela fonctionne. Mais lorsque je débogue sur l'émulateur Web dans Azure et le site Web hébergé sur le site Web de l'entreprise à l'aide de DirectLine, cela n'a pas fonctionné.

Quelqu'un sait-il comment le résoudre?

Ci-joint ma capture d'écran. Le côté gauche est de l'émulateur Web, le côté droit est de l'émulateur Bot Framework local

enter image description here

Mise à jour avec le code source (09 décembre 2019)

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("[email protected]", "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);

Mise à jour 17 décembre 2019

J'avais essayé d'utiliser Embedded et Direct Line. Mais l'erreur est toujours la même.

Le Bot n'est pas hébergé dans SharePoint.

Mise à jour du 6 janvier 2020 Son n'a pas fonctionné dans Azure Bot Services

9
Eng Soon Cheah

En fonction de votre description, vous pouvez en extraire des données localement. Cela signifie que votre code et votre logique sont corrects.

J'ai remarqué que votre URL sharePoint est: https://mvponduty.sharepoint.com/sites/sg/daw/ Et j'ai essayé d'y accéder, et j'ai également essayé d'accéder à l'intégralité de votre URL de demande: https://mvponduty.sharepoint.com/sites/sg/daw/_api/lists/getByTitle('data@work')/items?$filter=Keywords eq 'bloomberg' la réponse des deux sont toutes 404.

Et vous avez dit qu'il s'agit d'un site sur site, pourriez-vous donc vérifier si ce site est accessible à partir d'un réseau public?

Je suppose que lorsque vous testez votre code localement, vous pouvez accéder à ce site car vous êtes dans votre réseau interne qui pourra accéder au site sur site. Cependant, lorsque vous publiez votre code sur Azure, il ne fait plus partie de votre travail interne: il se trouve dans le réseau public et ne peut donc pas accéder à votre site sharePoint sur site qui a provoqué cette erreur.

Comme nous le savons, le code bot est hébergé sur le service d'application Azure, si cette erreur est causée par la raison ci-dessus, peut-être fonctionnalité de connexion hybride Azure App Service sera utile dans ce scénario.

3
Stanley Gong

ChatBot semble bien fonctionner? c'est envoyer et recevoir des messages. Il y a du code qui se comporte différemment lorsqu'il est exécuté localement ou hébergé. Il y a du Xml, est-ce un fichier ou généré? Vous devez vérifier qu'il suit la même logique et utilise les mêmes données que lorsqu'il est exécuté localement. Peut-être que si vous collez une partie du code (non confidentiel) là où il se bloque, nous pouvons avoir plus d'idées sur la façon d'aider

2
waleed

Lorsque vous publierez votre bot, il y aura une option comme ci-dessous:

Image

Sélectionnez Modifier les paramètres d'App Service. Ajoutez seulement les détails suivants, rien d'autre:

MicrosoftAppId : <xxxxx>
MicrosoftAppPassword : <xxxxx>

Cliquez sur Appliquer, OK.

Assurez-vous de supprimer le Microsoft App Id et Microsoft App Password depuis appsettings.json, afin qu'il fonctionne également dans l'émulateur de bot.

Publiez maintenant le bot. Cela fonctionnera aux deux endroits.

J'espère que cela vous sera utile.

2
mercury-01