ChatBot не работал в веб-эмуляторе, но хорошо работает в эмуляторе Local Bot Framework

9

Я разработал ChatBot, который интегрируется с SharePoint On Premise. Когда я отлаживаю ChatBot в эмуляторе, он работает. Но когда я выполнял отладку на веб-эмуляторе в Azure и веб-сайте, размещенном на веб-сайте компании с помощью DirectLine, это не сработало.

Кто-нибудь знает как это решить?

При этом мой скриншот. Левая сторона от веб-эмулятора, правая сторона от локального эмулятора Bot Framework

введите описание изображения здесь

Обновление с исходным кодом (09 декабря 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("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://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);

Обновление 17 декабря 2019 г.

Я пытался использовать Embedded и Direct Line. Но Ошибка все та же.

Бот не размещен в SharePoint.

Обновление 06 января 2020 г. В Azure Bot Services не работает

Eng Скоро Чеа
источник
Под веб-эмулятором вы имеете в виду функцию тестирования в веб-чате? Или это полный пакет чата / реализация. Это размещается на странице SharePoint / webpart / spfx?
Дана V
@ ДанаВ, да. Веб-эмулятор находится в веб-эмуляторе Azure, а также использует прямую линию в веб-чате на другой веб-странице. Чатбот не размещен на странице SharePoint.
Eng Скоро Чи

Ответы:

4

Основываясь на вашем описании, вы можете получить данные из него локально. Это означает, что ваш код и логика в порядке.

Я заметил, что ваш URL-адрес sharePoint: 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 .

Стэнли Гонг
источник
Исправьте, получите данные из внутреннего SharePoint. Должен ли я публиковать ChatBot во внутренней SharePoint?
Eng Вскоре Cheah
Привет @EngSoonCheah, он основан на том, кто будет использовать этого бота, теоретически вы можете опубликовать его в сети, в которой находится ваш сайт SharePoint. Если вам нужен внешний доступ к нему, вы должны опубликовать его в сети. Служба ботов Azure и использование функции гибридных подключений службы приложений Azure (служба ботов Azure основана на службе приложений Azure) для подключения службы приложений ботов к локальному сайту. Я думаю, что этот документ будет полезен: azuregems.io/azure-hybrid-connections
Стэнли Гонг
Привет @EngSoonCheah, как дела? Ваша проблема была решена?
Стэнли Гонг
все еще пробует Azure Hybrid Connections.
Eng Скоро Чи
@EngSoonCheah, ах ... понятно. Удачи, если есть какие-либо обновления, пожалуйста, дайте мне знать
Стэнли Гонг
2

Кажется, что ChatBot работает нормально? это отправка и получение сообщений. Есть некоторый код, который ведет себя по-разному при локальном запуске по сравнению с хостом. Там есть XML, это файл или сгенерированный? Вам нужно убедиться, что он следует той же логике и использует те же данные, что и при локальном запуске. Может быть, если вы вставите какой-то (не конфиденциальный) код, где он падает, у нас может быть больше идей, как помочь

Валид
источник
У меня было обновление с исходным кодом.
Eng Скоро Чи
Ошибка начинается со строки 136 в DispatchBot.cs. Что это за линия? нужно увидеть строку 136 этого метода
ProcessRSSAsync
Я должен был обновить исходный код, LINE 136 от HttpWebResponse
Eng Скоро Чи
Хорошо. Кажется, локально вы можете получить доступ к RSS sharepoint нормально, но при размещении он не возвращает тот же xml, что означает, что он, скорее всего, возвращает страницу ошибки HTML. Я искал свою ошибку и нашел это: forums.asp.net/t/... Это говорит о том , что вам может понадобиться использовать прокси - сервер, пожалуйста , попробуйте пример кода в этой ссылке
Валид
Отображение ошибки: System.PlatformNotSupportedException: операция не поддерживается на этой платформе.
Eng Скоро Чи
2

Когда вы публикуете своего бота, будет вариант, как показано ниже:

Образ

Выберите «Изменить настройки службы приложения». Добавьте только следующие детали, ничего больше:

MicrosoftAppId : <xxxxx>
MicrosoftAppPassword : <xxxxx>

Нажмите Применить, ОК.

Убедитесь, что вы удалили Microsoft App Idи Microsoft App Passwordиз appsettings.json, чтобы он работал и в эмуляторе бота.

Теперь опубликуйте бота. Это будет работать в обоих местах.

Надеюсь, это полезно.

ртутно-01
источник
Я видел только предварительный просмотр и настройку, потому что я загружаю исходный код ChatBot с портала Azure.
Eng Скоро Чи