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

9

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

entrez la description de l'image ici

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 06 janvier 2020 Son n'a pas fonctionné dans Azure Bot Services

Bientôt Cheah
la source
Par émulateur Web, vous voulez dire la fonction Tester dans le chat Web? Ou s'agit-il d'un ensemble / implémentation de discussion en ligne complète . Est-ce hébergé dans une page / webpart / spfx SharePoint?
Dana V
@DanaV, oui. L'émulateur Web se trouve dans l'émulateur Web Azure et utilise également la ligne directe dans le chat Web dans une autre page Web. Le chatbot n'est pas hébergé sur la page SharePoint.
Eng Soon Cheah

Réponses:

4

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'ensemble de votre URL de demande: https://mvponduty.sharepoint.com/sites/sg/daw/_api/lists/getByTitle('data@work')/items?$filter=Keywords eq 'bloomberg'les réponses des deux sont toutes 404.

Et vous avez dit qu'il s'agissait d'un site sur site, pourriez-vous donc vérifier si ce site est accessible depuis 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 que la fonctionnalité de connexion hybride d'Azure App Service sera utile dans ce scénario.

Stanley Gong
la source
Corrigez, récupérez les données de SharePoint interne. Dois-je publier le ChatBot dans le SharePoint interne?
Eng Soon Cheah
Salut @EngSoonCheah, il est basé sur qui utilisera ce bot, si ce n'est que pour les utilisateurs de votre réseau interne, théoriquement, vous pouvez le publier sur le réseau de votre site SharePoint. Si les utilisateurs externes doivent y accéder, vous devez le publier sur azot bot service et utilisez la fonctionnalité de connexions hybrides du service d'application Azure (le service Azure Bot est basé sur le service d'application Azure) pour connecter votre service d'application Bot à votre site local. Je pense que ce document sera utile: azuregems.io/azure-hybrid-connections
Stanley Gong
Salut @EngSoonCheah, comment ça va? Votre problème a-t-il été résolu?
Stanley Gong
essaie toujours les connexions hybrides Azure.
Eng Soon Cheah
@EngSoonCheah, Ah ... je vois. Bonne chance, s'il y a des mises à jour, veuillez me le faire savoir:)
Stanley Gong
2

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

waleed
la source
J'ai eu une mise à jour avec le code source.
Eng Soon Cheah
L'erreur commence à la ligne 136 dans DispatchBot.cs. De quelle ligne s'agit-il? besoin de voir la ligne 136 de cette méthode ProcessRSSAsync
waleed
J'avais mis à jour le code source, le LINE 136 de HttpWebResponse
Eng Soon Cheah
D'accord. Il semble que vous puissiez accéder localement au flux RSS de sharepoint, mais lorsqu'il est hébergé, il ne renvoie pas le même xml, ce qui signifie qu'il retourne très probablement une page d'erreur HTML. J'ai recherché votre erreur et trouvé ceci: forums.asp.net/t/… Cela suggère que vous pourriez avoir besoin d'utiliser Proxy, veuillez essayer l'exemple de code dans ce lien
waleed
L'affichage d'erreur: System.PlatformNotSupportedException: l'opération n'est pas prise en charge sur cette plate-forme.
Eng Soon Cheah
2

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

Image

Sélectionnez Modifier les paramètres 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 Idet Microsoft App Passwordde 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.

mercure-01
la source
Je n'avais vu que l'aperçu et la configuration parce que je télécharge le code source ChatBot à partir du portail Azure.
Eng Soon Cheah