O ChatBot não funcionou no emulador da Web, mas funcionou bem no emulador do Local Bot Framework

9

Eu desenvolvi o ChatBot que se integra ao SharePoint On Premise. Quando depuro o ChatBot no emulador, ele funciona. Mas quando depuro no Emulador da Web no Azure e no site hospedado no site da empresa usando o DirectLine, ele não funcionou.

Alguém sabe como resolver isso?

Aqui está minha imagem. O lado esquerdo é do Emulador da Web, o lado direito é do emulador local do Framework de Bot

insira a descrição da imagem aqui

Atualização com o código-fonte (09 de dezembro 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);

Atualização 17 de dezembro de 2019

Eu tentei usar Embedded e Direct Line. Mas o erro ainda é o mesmo.

O Bot não está hospedado no SharePoint.

Atualização 06 de janeiro de 2020 Não funcionou nos Serviços de Bot do Azure

Eng Soon Cheah
fonte
Por emulador da web, você quer dizer o recurso Testar no bate-papo na web? Ou é um pacote / implementação de webchat completo . Isso está sendo hospedado em uma página do SharePoint / webpart / spfx?
Dana V
@DanaV, sim. O emulador da Web está no emulador da Web do Azure e também usando a linha direta no bate-papo na Web em outra página da Web. O chatbot não está hospedado na página do SharePoint.
Eng Soon Cheah

Respostas:

4

Com base na sua descrição, você pode buscar dados localmente. Isso significa que seu código e lógica estão corretos.

Percebi que o URL do seu sharePoint é: https://mvponduty.sharepoint.com/sites/sg/daw/e tentei acessá-lo e também tentei acessar todo o URL de solicitação: https://mvponduty.sharepoint.com/sites/sg/daw/_api/lists/getByTitle('data@work')/items?$filter=Keywords eq 'bloomberg'a resposta dos dois é 404.

E você disse que este é um site no local, então você poderia verificar se esse site pode ser acessado a partir de uma rede pública?

Presumo que, ao testar seu código localmente, você pode acessar este site como em sua rede interna, que poderá acessar o site local. No entanto, quando você publica seu código no Azure, ele não está mais em seu trabalho interno: está em rede pública, de modo que não é possível acessar o site do sharePoint local que causou esse erro.

Como sabemos, o código bot está hospedado no serviço de aplicativo do Azure; se esse erro for causado pelo motivo acima, talvez o recurso Conexões Híbridas do Serviço de Aplicativo do Azure seja útil nesse cenário.

Stanley Gong
fonte
Corrija, recupere dados do SharePoint interno. Devo publicar o ChatBot no SharePoint interno?
Eng Soon Cheah
Olá, @EngSoonCheah, ele se baseia em quem usará esse bot; se for apenas para os usuários internos da rede, teoricamente, você poderá publicá-lo na rede em que está o site do SharePoint. Se usuários externos precisarem acessá-lo, publique-o em serviço de bot azul e use o recurso de conexões híbridas do serviço de aplicativo do Azure (o serviço de bot do Azure é baseado no serviço de aplicativo do Azure) para conectar seu serviço de aplicativo de bot ao site local. Eu acho que este documento será útil: azuregems.io/azure-hybrid-connections #
Stanley Gong
Oi @EngSoonCheah, como vai? O seu problema foi resolvido?
Stanley Gong
ainda está tentando as conexões híbridas do Azure.
Eng Soon Cheah
@EngSoonCheah, Ah ... entendo. Boa sorte, se houver alguma atualização, por favor, avise-me :)
Stanley Gong
2

O ChatBot parece estar funcionando bem? está enviando e recebendo mensagens. Há algum código que você tem que se comporta de maneira diferente quando executado localmente versus hospedado. Existe um XML, é um arquivo ou é gerado? Você precisa verificar se está seguindo a mesma lógica e usando os mesmos dados de quando é executado localmente. Talvez, se você colar parte do código (não confidencial) onde ele falha, podemos ter mais idéias de como ajudar

Waleed
fonte
Eu tive atualização com o código fonte.
Eng Soon Cheah
O erro inicia na linha 136 no DispatchBot.cs. Qual linha é essa? precisa ver a linha 136 deste método ProcessRSSAsync
waleed 09/12/19
Eu atualizei o código fonte, o LINE 136 do HttpWebResponse
Eng Soon Cheah
Está bem. Parece que localmente você pode acessar o RSS do sharepoint, mas quando hospedado, ele não está retornando o mesmo xml, o que significa que provavelmente está retornando uma página de erro em HTML. Eu pesquisei o seu erro e encontrei o seguinte: forums.asp.net/t/… Sugere que você pode precisar usar o Proxy, tente o exemplo de código nesse link
waleed
A exibição do erro: System.PlatformNotSupportedException: operação não é suportada nesta plataforma.
Eng Soon Cheah
2

Quando você publica seu bot, haverá uma opção como abaixo:

Imagem

Selecione Editar configurações do serviço de aplicativo. Adicione apenas os seguintes detalhes, nada mais:

MicrosoftAppId : <xxxxx>
MicrosoftAppPassword : <xxxxx>

Clique em Aplicar, OK.

Certifique-se de remover o Microsoft App Ide Microsoft App Passworddo appsettings.json, para que ele também funcione no emulador de bot.

Agora publique o bot. Ele funcionará nos dois lugares.

Espero que isso seja útil.

mercúrio-01
fonte
Eu só tinha visto o Preview and Configure porque baixei o código-fonte do ChatBot no Portal do Azure.
Eng Soon Cheah