SharePoint On Premiseと統合するChatBotを開発しました。チャットボットをエミュレータでデバッグすると、動作します。しかし、DirectLineを使用してAzureのWebエミュレーターと企業のWebサイトでホストされているWebサイトでデバッグすると、動作しませんでした。
誰かがそれを解決する方法を知っていますか?
これで私のスクリーンショット。左側はWebエミュレーターから、右側はローカルBot Frameworkエミュレーターから
ソースコードで更新(2019年12月9日)
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);
2019年12月17日更新
EmbeddedとDirect Lineを使用してみました。しかし、エラーはまだ同じです。
ボットはSharePointでホストされていません。
更新2020年1月6日Azure Bot Servicesでは機能しませんでした
説明に基づいて、ローカルからデータをフェッチできます。これは、コードとロジックに問題がないことを意味します。
あなたのsharePoint URLが_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'
2つの応答はすべて404です。
そして、あなたはこれがオンプレミスのサイトだと言ったので、このサイトがパブリックネットワークから到達できるかどうかを確認してもらえますか?
コードをローカルでテストすると、オンプレミスサイトにアクセスできる内部ネットワークにいるので、このサイトにアクセスできると思います。ただし、Azureにコードを公開すると、内部の作業ではなくなります。パブリックネットワークにあるため、このエラーの原因となったオンプレミスのSharePointサイトにアクセスできません。
ご存知のように、ボットコードはAzureアプリサービスでホストされています。このエラーが上記の理由で発生した場合、多分 Azureアプリサービスのハイブリッド接続機能 がこのシナリオで役立ちます。
ChatBotは正常に動作しているようですか?メッセージを送受信しています。ローカルで実行された場合とホストされた場合で動作が異なるコードがいくつかあります。 Xmlがあります。それはファイルですか、それとも生成されますか?ローカルで実行する場合と同じロジックに従い、同じデータを使用していることを確認する必要があります。おそらく、(機密ではない)コードの一部を貼り付けると、クラッシュする可能性があるため、さらに多くのアイデアを得ることができます