ChatBot funktionierte nicht im Web Emulator, aber gut im Local Bot Framework Emulator

9

Ich habe den ChatBot entwickelt, der in SharePoint On Premise integriert ist. Wenn ich den ChatBot im Emulator debugge, funktioniert es. Beim Debuggen auf Web Emulator in Azure und auf der Unternehmenswebsite gehosteten Website mithilfe von DirectLine funktionierte dies jedoch nicht.

Weiß jemand, wie man es löst?

Hiermit mein Screenshot. Die linke Seite stammt vom Web Emulator, die rechte Seite vom lokalen Bot Framework Emulator

Geben Sie hier die Bildbeschreibung ein

Update mit Quellcode (09. Dezember 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);

Update 17. Dezember 2019

Ich hatte versucht, Embedded und Direct Line zu verwenden. Aber der Fehler ist immer noch der gleiche.

Der Bot wird nicht in SharePoint gehostet.

Update 06. Januar 2020 In Azure Bot Services hat es nicht funktioniert

Eng Soon Cheah
quelle
Mit Web-Emulator meinen Sie die Funktion "Test im Web-Chat"? Oder ist es ein vollständiges Webchat- Bundle / eine vollständige Implementierung ? Wird dies auf einer SharePoint-Seite / einem Webpart / einem SPFX gehostet?
Dana V
@ DanaV, ja. Der Webemulator befindet sich im Azure-Webemulator und verwendet im Webchat auf einer anderen Webseite Directline. Der Chatbot wird nicht auf der SharePoint-Seite gehostet.
Eng Soon Cheah

Antworten:

4

Basierend auf Ihrer Beschreibung können Sie Daten lokal abrufen. Dies bedeutet, dass Ihr Code und Ihre Logik in Ordnung sind.

Ich habe festgestellt, dass Ihre SharePoint-URL lautet: https://mvponduty.sharepoint.com/sites/sg/daw/und ich habe versucht, darauf zuzugreifen, und habe auch versucht, auf Ihre gesamte Anforderungs-URL zuzugreifen: https://mvponduty.sharepoint.com/sites/sg/daw/_api/lists/getByTitle('data@work')/items?$filter=Keywords eq 'bloomberg'Die Antwort der beiden ist alle 404.

Und Sie sagten, dies sei eine On-Prem-Site. Könnten Sie also überprüfen, ob diese Site über ein öffentliches Netzwerk erreichbar ist?

Ich gehe davon aus, dass Sie beim lokalen Testen Ihres Codes auf diese Site zugreifen können, während Sie sich in Ihrem internen Netzwerk befinden, das auf die lokale Site zugreifen kann. Wenn Sie Ihren Code jedoch in Azure veröffentlichen, befindet er sich nicht mehr in Ihrer internen Arbeit: Er befindet sich in einem öffentlichen Netzwerk, sodass Sie nicht auf Ihre lokale SharePoint-Website zugreifen können, die diesen Fehler verursacht hat.

Wie wir wissen, wird Bot-Code im Azure-App-Dienst gehostet. Wenn dieser Fehler aus dem oben genannten Grund verursacht wird, ist die Azure App Service-Hybridverbindungsfunktion in diesem Szenario möglicherweise hilfreich.

Stanley Gong
quelle
Korrigieren Sie Daten und rufen Sie sie aus internem SharePoint ab. Soll ich den ChatBot im internen SharePoint veröffentlichen?
Eng Soon Cheah
Hi @EngSoonCheah, es basiert darauf, wer diesen Bot verwendet. Wenn er nur für Ihre internen Netzwerkbenutzer bestimmt ist, können Sie ihn theoretisch in dem Netzwerk veröffentlichen, in dem Ihre SharePoint-Website vorhanden ist. Wenn externe Benutzer darauf zugreifen müssen, sollten Sie ihn veröffentlichen Azure-Bot-Dienst und verwenden Sie die Hybridverbindungsfunktion des Azure-App-Dienstes (der Azure-Bot-Dienst basiert auf dem Azure-App-Dienst), um Ihren Bot-App-Dienst mit Ihrer lokalen Site zu verbinden. Ich denke, dieses Dokument wird hilfreich sein: azuregems.io/azure-hybrid-connections
Stanley Gong
Hi @EngSoonCheah, wie geht es dir? Wurde Ihr Problem gelöst?
Stanley Gong
Versuchen Sie immer noch die Azure Hybrid-Verbindungen.
Eng Soon Cheah
@EngSoonCheah, Ah ... ich verstehe. Viel Glück, wenn es irgendwelche Updates gibt, lass es mich wissen :)
Stanley Gong
2

ChatBot scheint gut zu funktionieren? Es sendet und empfängt Nachrichten. Es gibt einen Code, der sich anders verhält, wenn er lokal als gehostet ausgeführt wird. Es gibt XML, ist es eine Datei oder generiert? Sie müssen überprüfen, ob es der gleichen Logik folgt und dieselben Daten verwendet wie bei der lokalen Ausführung. Wenn Sie einen Teil des (nicht vertraulichen) Codes einfügen, in dem er abstürzt, können wir möglicherweise weitere Ideen haben, wie Sie helfen können

waleed
quelle
Ich hatte ein Update mit dem Quellcode.
Eng Soon Cheah
Der Fehler beginnt in Zeile 136 in DispatchBot.cs. Welche Linie ist das? müssen Zeile 136 dieser Methode sehen ProcessRSSAsync
waleed
Ich hatte den Quellcode, die LINE 136 von HttpWebResponse
Eng Soon Cheah
OK. Es scheint, dass Sie lokal problemlos auf das Sharepoint-RSS zugreifen können, aber wenn es gehostet wird, wird nicht dieselbe XML zurückgegeben, was bedeutet, dass höchstwahrscheinlich eine HTML-Fehlerseite zurückgegeben wird. Ich habe Ihren Fehler durchsucht und Folgendes gefunden: forums.asp.net/t/… Es deutet darauf hin, dass Sie möglicherweise Proxy verwenden müssen. Bitte versuchen Sie das Codebeispiel in diesem Link
waleed
Die Fehleranzeige: System.PlatformNotSupportedException: Der Vorgang wird auf dieser Plattform nicht unterstützt.
Eng Soon Cheah
2

Wenn Sie Ihren Bot veröffentlichen, gibt es eine Option wie folgt:

Bild

Wählen Sie App Service-Einstellungen bearbeiten. Fügen Sie nur die folgenden Details hinzu, sonst nichts:

MicrosoftAppId : <xxxxx>
MicrosoftAppPassword : <xxxxx>

Klicken Sie auf Übernehmen, OK.

Stellen Sie sicher, dass Sie das Microsoft App Idund Microsoft App Passwordaus appsettings.json entfernen , damit es auch im Bot-Emulator funktioniert.

Veröffentlichen Sie nun den Bot. Es wird an beiden Orten funktionieren.

Hoffe das ist hilfreich.

Quecksilber-01
quelle
Ich hatte die Vorschau und Konfiguration nur gesehen, weil ich den ChatBot-Quellcode von Azure Portal heruntergeladen habe.
Eng Soon Cheah