ChatBot no funcionó en el emulador web, pero funcionó bien en el emulador Local Bot Framework

9

Desarrollé el ChatBot que se integra con SharePoint On Premise. Cuando depuro el ChatBot en el emulador, funciona. Pero cuando depuro en Web Emulator en Azure y en el sitio web alojado en el sitio web de la empresa utilizando DirectLine, no funcionó.

alguien sabe como resolverlo?

Con esto mi captura de pantalla. El lado izquierdo es de Web Emulator, el lado derecho es de Bot Framework Emulator local

ingrese la descripción de la imagen aquí

Actualización con código fuente (09 de diciembre de 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);

Actualización 17 de diciembre de 2019

Intenté usar Embedded y Direct Line. Pero el error sigue siendo el mismo.

El Bot no está alojado en SharePoint.

Actualización 06 de enero de 2020 No funcionó en Azure Bot Services

Eng Soon Cheah
fuente
Por emulador web, ¿te refieres a la función Prueba en el chat web? ¿O es un paquete completo de webchat / implementación? ¿Está esto alojado en una página de SharePoint / webpart / spfx?
Dana V
@DanaV, sí. El emulador web está en el emulador web de Azure y también usa directline en webchat en otra página web. El chatbot no está alojado en la página de SharePoint.
Eng Soon Cheah

Respuestas:

4

Según su descripción, puede obtener datos de ella localmente. Esto significa que su código y lógica están bien.

Me di cuenta de que su URL sharePoint es: https://mvponduty.sharepoint.com/sites/sg/daw/e intenté acceder a ella, y también intenté acceder a toda su URL de solicitud: https://mvponduty.sharepoint.com/sites/sg/daw/_api/lists/getByTitle('data@work')/items?$filter=Keywords eq 'bloomberg'la respuesta de ambos es 404.

Y usted dijo que este es un sitio local, entonces, ¿podría comprobar si se puede acceder a este sitio desde una red pública?

Supongo que cuando prueba su código localmente, puede acceder a este sitio ya que está en su red interna, que podrá acceder al sitio local. Sin embargo, cuando publica su código en Azure, ya no está en su trabajo interno: está en una red pública, por lo que no puede acceder a su sitio sharePoint premier que causó este error.

Como sabemos, el código de bot está alojado en el servicio de aplicaciones de Azure, si este error es causado por la razón anterior, tal vez la característica de Conexiones híbridas del Servicio de aplicaciones de Azure sea ​​útil en este escenario.

Stanley Gong
fuente
Corregir, recuperar datos de SharePoint interno. ¿Debo publicar ChatBot en el SharePoint interno?
Eng Soon Cheah
Hola @EngSoonCheah se basa en quién usará este bot, si es solo para los usuarios de su red interna, en teoría, puede publicarlo en la red en su sitio de SharePoint. Si los usuarios externos necesitan acceder a él, debe publicarlo en azure bot service, y use la función de conexiones híbridas del servicio de aplicaciones de Azure (el servicio de bot de Azure se basa en el servicio de aplicaciones de Azure) para conectar su servicio de aplicaciones de bot a su sitio local. Creo que este documento será útil: azuregems.io/azure-hybrid-connections
Stanley Gong
Hola @EngSoonCheah, ¿cómo te va? ¿Su problema ha sido resuelto?
Stanley Gong
Todavía estoy intentando las conexiones híbridas de Azure.
Eng Soon Cheah
@EngSoonCheah, Ah ... Ya veo. Buena suerte, si hay alguna actualización, por favor hágamelo saber
:)
2

¿ChatBot parece estar funcionando bien? está enviando y recibiendo mensajes. Hay un código que tiene que se comporta de manera diferente cuando se ejecuta localmente en lugar de hospedado. Hay Xml, ¿es un archivo o se genera? Debe comprobar que sigue la misma lógica y utiliza los mismos datos que cuando se ejecuta localmente. Tal vez si pega algo del código (no confidencial) donde se bloquea, podemos tener más ideas sobre cómo ayudar

waleed
fuente
Tenía actualización con el código fuente.
Eng Soon Cheah
El error comienza en la línea 136 en DispatchBot.cs. Que linea es necesita ver la línea 136 de este método ProcessRSSAsync
waleed
Había actualizado el código fuente, el LINE 136 de HttpWebResponse
Eng Soon Cheah
Okay. Parece que localmente puede acceder al sharepoint RSS bien, pero cuando está alojado no devuelve el mismo xml, lo que significa que lo más probable es que devuelva una página de error HTML. Busqué su error y encontré esto: forums.asp.net/t/… Sugiere que es posible que necesite usar Proxy, intente con el ejemplo de código en ese enlace
waleed
La pantalla de error: System.PlatformNotSupportedException: la operación no es compatible con esta plataforma.
Eng Soon Cheah
2

Cuando publique su bot, habrá una opción como la siguiente:

Imagen

Seleccione Editar configuración del servicio de aplicaciones. Agregue solo los siguientes detalles, nada más:

MicrosoftAppId : <xxxxx>
MicrosoftAppPassword : <xxxxx>

Haga clic en Aplicar, Ok.

Asegúrese de eliminar Microsoft App Idy Microsoft App Passwordde appsettings.json, para que también funcione en el emulador de bot.

Ahora publique el bot. Funcionará en ambos lugares.

Espero que esto sea útil.

mercurio-01
fuente
Solo había visto la vista previa y la configuración porque descargué el código fuente de ChatBot desde Azure Portal.
Eng Soon Cheah