ChatBot nie działał w emulatorze sieci, ale działał dobrze w emulatorze lokalnego bota

9

Opracowałem ChatBota, który integruje się z SharePoint On Premise. Kiedy debuguję ChatBota w emulatorze, działa. Ale kiedy debugowałem w emulatorze sieci na platformie Azure i witrynie hostowanej w witrynie firmowej za pomocą funkcji DirectLine, nie działało.

Czy ktoś wie jak to rozwiązać?

Oto mój zrzut ekranu. Lewa strona pochodzi z emulatora sieci, prawa strona z lokalnego emulatora Bot Framework

wprowadź opis zdjęcia tutaj

Aktualizacja z kodem źródłowym (09 grudnia 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);

Aktualizacja 17 grudnia 2019 r

Próbowałem użyć linii Embedded i Direct Line. Ale błąd nadal taki sam.

Bot nie jest hostowany w SharePoint.

Aktualizacja 06 stycznia 2020 To nie działało w Azure Bot Services

Eng Wkrótce Cheah
źródło
Przez emulator internetowy masz na myśli funkcję Testuj na czacie internetowym? A może jest to pełny pakiet / implementacja czatu internetowego? Czy to jest hostowane na stronie SharePoint / webpart / spfx?
Dana V
@DanaV, tak. Emulator sieci Web znajduje się w emulatorze sieci Web platformy Azure, a także używa linii bezpośredniej w czacie na innej stronie internetowej. Chatbot nie jest hostowany na stronie SharePoint.
Eng Wkrótce Cheah

Odpowiedzi:

4

Na podstawie opisu możesz pobrać z niego dane lokalnie. Oznacza to, że Twój kod i logika są w porządku.

Zauważyłem, że Twój adres URL programu SharePoint to: https://mvponduty.sharepoint.com/sites/sg/daw/i próbowałem uzyskać do niego dostęp, a także próbowałem uzyskać dostęp do całego adresu URL żądania: https://mvponduty.sharepoint.com/sites/sg/daw/_api/lists/getByTitle('data@work')/items?$filter=Keywords eq 'bloomberg'wszystkie dwa mają odpowiedź 404.

Powiedziałeś, że jest to strona internetowa, więc czy możesz sprawdzić, czy można uzyskać dostęp do tej witryny z sieci publicznej?

Zakładam, że kiedy testujesz kod lokalnie, możesz uzyskać dostęp do tej witryny w swojej wewnętrznej sieci, która będzie mogła uzyskać dostęp do strony internetowej. Jednak po opublikowaniu kodu na platformie Azure nie ma go już w wewnętrznej pracy: jest on w sieci publicznej, więc nie ma dostępu do Twojej witryny SharePoint, która spowodowała ten błąd.

Jak wiemy, kod bota jest hostowany w usłudze aplikacji Azure, jeśli ten błąd jest spowodowany powyższym powodem, być może funkcja połączeń hybrydowych usługi Azure App Service będzie pomocna w tym scenariuszu.

Stanley Gong
źródło
Popraw, pobierz dane z wewnętrznego SharePoint. Czy powinienem opublikować ChatBota w wewnętrznym SharePoint?
Eng Wkrótce Cheah,
Cześć @EngSoonCheah, to zależy od tego, kto użyje tego bota, jeśli jest on przeznaczony tylko dla użytkowników wewnętrznej sieci, teoretycznie możesz opublikować go w sieci, w której znajduje się witryna SharePoint. Jeśli użytkownicy zewnętrzni muszą uzyskać do niego dostęp, powinieneś opublikować go na usługę lazurowego bota i użyj funkcji połączeń hybrydowych usługi aplikacji Azure (usługa bota Azure opiera się na usłudze aplikacji Azure), aby połączyć usługę aplikacji bota z lokalną witryną. Myślę, że ten dokument będzie pomocny: azuregems.io/azure-hybrid-connections
Stanley Gong
Cześć @EngSoonCheah, jak leci? Czy Twój problem został rozwiązany?
Stanley Gong,
wciąż próbuję połączeń hybrydowych platformy Azure.
Eng Wkrótce Cheah,
@EngSoonCheah, Ah ... Rozumiem. Powodzenia, jeśli są jakieś aktualizacje, proszę dać mi znać
Stanley Gong,
2

ChatBot wydaje się działać dobrze? wysyła i odbiera wiadomości. Istnieje kod, który zachowuje się inaczej, gdy jest uruchamiany lokalnie w porównaniu z hostowanym. Jest Xml, czy to plik, czy wygenerowany? Musisz sprawdzić, czy działa on zgodnie z tą samą logiką i używa tych samych danych, co podczas uruchamiania lokalnego. Może po wklejeniu części (niepoufnego) kodu, w którym ulega awarii, możemy uzyskać więcej pomysłów na pomoc

waleed
źródło
Miałem aktualizację z kodem źródłowym.
Eng Wkrótce Cheah
Błąd zaczyna się od linii 136 w DispatchBot.cs. Która to linia? muszę zobaczyć wiersz 136 tej metody ProcessRSSAsync
waleed
Miałem aktualizację kodu źródłowego, LINE 136 z HttpWebResponse
Eng Soon Cheah
Ok. Wydaje się, że lokalnie możesz uzyskać dostęp do SharePoint RSS w porządku, ale gdy jest hostowany, nie zwraca tego samego xml, co oznacza, że ​​najprawdopodobniej zwraca stronę błędu HTML. Przeszukałem twój błąd i znalazłem to: forums.asp.net/t/… Sugeruje to, że możesz potrzebować użyć proxy, spróbuj próbki kodu w tym linku
waleed
Wyświetlany jest błąd: System.PlatformNotSupportedException: Operacja nie jest obsługiwana na tej platformie.
Eng Wkrótce Cheah
2

Kiedy opublikujesz swojego bota, pojawi się opcja jak poniżej:

Wizerunek

Wybierz Edytuj ustawienia usługi aplikacji. Dodaj tylko następujące szczegóły, nic więcej:

MicrosoftAppId : <xxxxx>
MicrosoftAppPassword : <xxxxx>

Kliknij Zastosuj, Ok.

Upewnij się, że usunąłeś plik Microsoft App Idi Microsoft App Passwordz appsettings.json, aby działał również w emulatorze bota.

Teraz opublikuj bota. Będzie działać w obu miejscach.

Mam nadzieję, że to jest pomocne.

rtęć-01
źródło
Widziałem tylko podgląd i konfigurację, ponieważ pobieram kod źródłowy ChatBot z portalu Azure.
Eng Wkrótce Cheah