ChatBot 从 SharePoint On Premise Issue 检索数据
ChatBot retrieve data from SharePoint On Premise Issue
我开发了一个与 SharePoint on Premise 通信的聊天机器人,
当我 运行 模拟器中的聊天机器人正常工作时。
但是当我 运行 在 SharePoint 外部托管的 Web 上时,它不起作用。
这是我在 Azure 上出错的截图,错误的结果是从 XMLReader 和 SyndicationFeed 开始
本地模拟器成功
这是我的源代码。
private async Task ProcessRSSAsync(ITurnContext<IMessageActivity> turnContext, LuisResult luisResult, string intent, CancellationToken cancellationToken)
{
var questionluis = turnContext.Activity.Text;
await turnContext.SendActivityAsync("intent recognize" + intent);
var intentresut = intent;
await turnContext.SendActivityAsync("Get LUIS Entity");
await turnContext.SendActivityAsync(string.Join("\t", luisResult.Entities.Select((entityObj) => entityObj.Entity)));
var entityfound = string.Join("\t", luisResult.Entities.Select((entityObj) => entityObj.Entity));
string spxurl = @"https://intra.aspac.com/sites/sg/daw/_layouts/15/srchrss.aspx?k=*%20ListId:7BC0F2C3-6366-48B8-B88A-8738BE1F9C31";
await turnContext.SendActivityAsync("Intent: " + intent.ToString() + " Entity: " + entityfound.ToString());
////---------------------------------------------------------------------------------------------
//22112019
try
{
//#ES09122019
var credentials = new NetworkCredential("email@example.com", "Pa$$w0rd", "sg.kworld.com");
var handler = new HttpClientHandler { Credentials = credentials, UseDefaultCredentials = false };
var client = new HttpClient(handler);
client.BaseAddress = new Uri("https://intra.aspac.com/sites/sg/daw/");
HttpResponseMessage resp = client.GetAsync("_layouts/15/srchrss.aspx?k=" + entityfound + "*%20ListId:7BC0F2C3-6366-48B8-B88A-8738BE1F9C31").Result;
string respString = resp.Content.ReadAsStringAsync().Result;
if (resp.StatusCode == HttpStatusCode.OK)
{
await turnContext.SendActivityAsync("Connected");
//Success 06122019 .
try
{
string spurl = @"https://intra.aspac.com/sites/sg/daw/_layouts/15/srchrss.aspx?k=*%20ListId:7BC0F2C3-6366-48B8-B88A-8738BE1F9C31";
XmlSecureResolver resolver = new XmlSecureResolver(new XmlUrlResolver(), spurl);
resolver.Credentials = new NetworkCredential("email@example.com.sg", "Pa$$w0rd", "sg.kworld.com");
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationType = ValidationType.DTD;
settings.XmlResolver = resolver;
XmlReader reader = XmlReader.Create(spurl, settings);
SyndicationFeed feed = SyndicationFeed.Load(reader);
reader.Close();
var attachments = new List<Attachment>();
foreach (SyndicationItem item in feed.Items)
{
//Get Title,Description,URL
String title = item.Title.Text;
String description = item.Summary.Text;
String link = item.Links.FirstOrDefault().Uri.ToString();
//Hero Card
var heroCard = new HeroCard(
title: item.Title.Text,
// subtitle: description,
buttons: new CardAction[]
{
new CardAction(ActionTypes.OpenUrl,"Learn More",value:link)
}
).ToAttachment();
attachments.Add(heroCard);
}
var reply = MessageFactory.Carousel(attachments);
await turnContext.SendActivityAsync(reply);
await ProcessCosmoDBStorageLUISAsync(turnContext, questionluis, intent, entityfound, respString, cancellationToken);
}
catch (Exception ex)
{
await turnContext.SendActivityAsync(ex.ToString());
}
}
}
catch (Exception ex)
{
await turnContext.SendActivityAsync("Sorry,Currently Server Under Maintenace");
await turnContext.SendActivityAsync(ex.ToString());
}
}
对此有什么解决方案和建议吗?
我在使用本地数据库时遇到了类似的问题。当您在外部部署机器人时,机器人需要 Internet 上可用的资源,而不是内部包含的资源。使用 bot 模拟器可以正常工作,因为它可以访问您的机器。
也就是说,azure 已经开发了一些可以用来帮助解决这个问题的操作。如果您查看应用程序代理,那可能会帮助您。
我想这就是你的意思...无论如何!
好的,我想我终于更好地理解了这一点,所以希望能把一个有用的回复放在一起。如果我们有一个共享的白板会容易得多:-)
基本上,就在 Microsoft Bot Framework Services 上托管机器人而言,您需要在 Azure 中进行注册。但是,有两种不同的选择,并且两者在托管方面有很大不同。当您 "create" Azure 中的资源并搜索 "Bot" 时,您将看到两个选项 - "Web App Bot" 和 "Bot Channels Registration":
- "Bot Channels Registration" 表示仅在 Azure 中注册您的机器人,但将其托管在其他地方。
- "Web App Bot" - 包括 "Bot Channels Registration" 但也使用 Azure Web 应用程序添加托管(因此它是 Bot 注册 PLUS 托管)
从您发布的屏幕截图中,我可以看到您选择了上面的 (2),因此您的机器人 运行正在 Azure 中,因此可以'连接到您的本地资源 (SharePoint)。
因此,我建议以下两个选项之一:
特别创建一个Azure Application Proxy - this is basically a small gateway so that your bot HOSTED in Azure can securely talk to your on-premises SharePoint. There is in fact a specific use case for SharePoint。
删除并重新创建您的 Azure Bot 条目,使其只是一个 "Bot Channels Registration",然后在 "Settings" 屏幕中您可以调用托管在任何 "https"端点。然后,您可以在本地网络 运行 上安装您的机器人 ,但它需要一个实时 "https" 地址(这并不难,但您有让您的 IT 团队参与获取实时网址,例如 "whatever.aspac.com",您需要一个 SSL/TLS 证书,以便它可以 运行 httpS 而不仅仅是 http。
您选择哪个选项可能取决于您的团队以及组织的技能和资源。例如,公司可能已经配置了 Azure 应用程序代理,在这种情况下可以节省大量工作。它可能有一个通配符证书,这将使选项 (2) 更容易等。
无论如何,我希望对您有所帮助,但如果仍有任何不清楚的地方,请随时询问更多。
我开发了一个与 SharePoint on Premise 通信的聊天机器人,
当我 运行 模拟器中的聊天机器人正常工作时。
但是当我 运行 在 SharePoint 外部托管的 Web 上时,它不起作用。
这是我在 Azure 上出错的截图,错误的结果是从 XMLReader 和 SyndicationFeed 开始
本地模拟器成功
这是我的源代码。
private async Task ProcessRSSAsync(ITurnContext<IMessageActivity> turnContext, LuisResult luisResult, string intent, CancellationToken cancellationToken)
{
var questionluis = turnContext.Activity.Text;
await turnContext.SendActivityAsync("intent recognize" + intent);
var intentresut = intent;
await turnContext.SendActivityAsync("Get LUIS Entity");
await turnContext.SendActivityAsync(string.Join("\t", luisResult.Entities.Select((entityObj) => entityObj.Entity)));
var entityfound = string.Join("\t", luisResult.Entities.Select((entityObj) => entityObj.Entity));
string spxurl = @"https://intra.aspac.com/sites/sg/daw/_layouts/15/srchrss.aspx?k=*%20ListId:7BC0F2C3-6366-48B8-B88A-8738BE1F9C31";
await turnContext.SendActivityAsync("Intent: " + intent.ToString() + " Entity: " + entityfound.ToString());
////---------------------------------------------------------------------------------------------
//22112019
try
{
//#ES09122019
var credentials = new NetworkCredential("email@example.com", "Pa$$w0rd", "sg.kworld.com");
var handler = new HttpClientHandler { Credentials = credentials, UseDefaultCredentials = false };
var client = new HttpClient(handler);
client.BaseAddress = new Uri("https://intra.aspac.com/sites/sg/daw/");
HttpResponseMessage resp = client.GetAsync("_layouts/15/srchrss.aspx?k=" + entityfound + "*%20ListId:7BC0F2C3-6366-48B8-B88A-8738BE1F9C31").Result;
string respString = resp.Content.ReadAsStringAsync().Result;
if (resp.StatusCode == HttpStatusCode.OK)
{
await turnContext.SendActivityAsync("Connected");
//Success 06122019 .
try
{
string spurl = @"https://intra.aspac.com/sites/sg/daw/_layouts/15/srchrss.aspx?k=*%20ListId:7BC0F2C3-6366-48B8-B88A-8738BE1F9C31";
XmlSecureResolver resolver = new XmlSecureResolver(new XmlUrlResolver(), spurl);
resolver.Credentials = new NetworkCredential("email@example.com.sg", "Pa$$w0rd", "sg.kworld.com");
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationType = ValidationType.DTD;
settings.XmlResolver = resolver;
XmlReader reader = XmlReader.Create(spurl, settings);
SyndicationFeed feed = SyndicationFeed.Load(reader);
reader.Close();
var attachments = new List<Attachment>();
foreach (SyndicationItem item in feed.Items)
{
//Get Title,Description,URL
String title = item.Title.Text;
String description = item.Summary.Text;
String link = item.Links.FirstOrDefault().Uri.ToString();
//Hero Card
var heroCard = new HeroCard(
title: item.Title.Text,
// subtitle: description,
buttons: new CardAction[]
{
new CardAction(ActionTypes.OpenUrl,"Learn More",value:link)
}
).ToAttachment();
attachments.Add(heroCard);
}
var reply = MessageFactory.Carousel(attachments);
await turnContext.SendActivityAsync(reply);
await ProcessCosmoDBStorageLUISAsync(turnContext, questionluis, intent, entityfound, respString, cancellationToken);
}
catch (Exception ex)
{
await turnContext.SendActivityAsync(ex.ToString());
}
}
}
catch (Exception ex)
{
await turnContext.SendActivityAsync("Sorry,Currently Server Under Maintenace");
await turnContext.SendActivityAsync(ex.ToString());
}
}
对此有什么解决方案和建议吗?
我在使用本地数据库时遇到了类似的问题。当您在外部部署机器人时,机器人需要 Internet 上可用的资源,而不是内部包含的资源。使用 bot 模拟器可以正常工作,因为它可以访问您的机器。
也就是说,azure 已经开发了一些可以用来帮助解决这个问题的操作。如果您查看应用程序代理,那可能会帮助您。
我想这就是你的意思...无论如何!
好的,我想我终于更好地理解了这一点,所以希望能把一个有用的回复放在一起。如果我们有一个共享的白板会容易得多:-)
基本上,就在 Microsoft Bot Framework Services 上托管机器人而言,您需要在 Azure 中进行注册。但是,有两种不同的选择,并且两者在托管方面有很大不同。当您 "create" Azure 中的资源并搜索 "Bot" 时,您将看到两个选项 - "Web App Bot" 和 "Bot Channels Registration":
- "Bot Channels Registration" 表示仅在 Azure 中注册您的机器人,但将其托管在其他地方。
- "Web App Bot" - 包括 "Bot Channels Registration" 但也使用 Azure Web 应用程序添加托管(因此它是 Bot 注册 PLUS 托管)
从您发布的屏幕截图中,我可以看到您选择了上面的 (2),因此您的机器人 运行正在 Azure 中,因此可以'连接到您的本地资源 (SharePoint)。
因此,我建议以下两个选项之一:
特别创建一个Azure Application Proxy - this is basically a small gateway so that your bot HOSTED in Azure can securely talk to your on-premises SharePoint. There is in fact a specific use case for SharePoint。
删除并重新创建您的 Azure Bot 条目,使其只是一个 "Bot Channels Registration",然后在 "Settings" 屏幕中您可以调用托管在任何 "https"端点。然后,您可以在本地网络 运行 上安装您的机器人 ,但它需要一个实时 "https" 地址(这并不难,但您有让您的 IT 团队参与获取实时网址,例如 "whatever.aspac.com",您需要一个 SSL/TLS 证书,以便它可以 运行 httpS 而不仅仅是 http。
您选择哪个选项可能取决于您的团队以及组织的技能和资源。例如,公司可能已经配置了 Azure 应用程序代理,在这种情况下可以节省大量工作。它可能有一个通配符证书,这将使选项 (2) 更容易等。
无论如何,我希望对您有所帮助,但如果仍有任何不清楚的地方,请随时询问更多。