【发布时间】:2019-02-07 18:33:01
【问题描述】:
我正在使用 Bot Framework v4 SDK。我正在尝试将通过机器人上传到 Microsoft Teams 的图片下载到临时目录中,然后使用该图片。我之所以这样做是因为我需要拍摄一张用户附加到聊天中的照片,然后将这张照片放入文档中并将文档返回给用户。这在我在模拟器上运行时有效,但一旦机器人在 Teams 中,我就会收到错误。
我通过 AttachmentPrompt 提示用户输入照片:
return await stepContext.PromptAsync(
"imagePrompt",
new PromptOptions
{
Prompt = MessageFactory.Text("Please attach a picture."),
});
从 stepContext.Result 中获取附件:
List<Attachment> contextAttachmentResult = (List<Attachment>)stepContext.Result;
确定文件的托管位置
var remoteFileUrl = contextAttachmentResult[0].ContentUrl;
设置系统临时目录的路径
var tempImagePath = Path.Combine(Path.GetTempPath(), contextAttachmentResult[0].Name);
并尝试使用WebClient下载文件
using (var webClient = new WebClient())
{
webClient.Headers.Add("User-Agent", "Other");
webClient.Headers.Add("Authorization", userProfile.Token);
webClient.DownloadFile(remoteFileUrl, tempImagePath);
}
我尝试将令牌放入我从OAuthPrompt 获得的令牌,但我仍然得到 403。当我尝试下载它时,403 就出现了。我认为这是 SharePoint 问题的原因是因为如果我打印出 remoteFileUrl 我会得到 https://company-my.sharepoint.com/personal/my_name/Documents/Microsoft Teams Chat Files/someImage.png
堆栈跟踪的开头是:
System.Net.WebException: The remote server returned an error: (403) FORBIDDEN. at System.Net.HttpWebRequest.GetResponse() at System.Net.WebClient.GetWebResponse(WebRequest request) at System.Net.WebClient.DownloadBits(WebRequest request, Stream writeStream) at System.Net.WebClient.DownloadFile(Uri address, String fileName)
编辑:
根据 Mick 的评论,我尝试以这种方式使用 ConnectorClient(并尝试两种不同的下载方式):
using (var connectorClient = new ConnectorClient(new Uri(stepContext.Context.Activity.ServiceUrl, MYAPPID, MYAPPPASSWORD)))
{
var token = await (connectorClient.Credentials as MicrosoftAppCredentials).GetTokenAsync();
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(contextAttachmentResult[0].ContentType));
var byteArray = await httpClient.GetByteArrayAsync(remoteFileUrl);
}
using (var webClient = new WebClient())
{
webClient.Headers.Add("User-Agent", "Other");
webClient.Headers.Add("Authorization", token);
webClient.DownloadFile(remoteFileUrl, siteReviewFile1ImagePath);
}
}
但即使我已将连接器设置为使用我的 appId 和 appPwd System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized). at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode() at System.Net.Http.HttpClient.d__30.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at IBIBot.Dialogs.SiteReviewSpace.SiteReviewDialog.<>c__DisplayClass4_0.<<-ctor>b__2>d.MoveNext() in
我仍然对如何下载此文件感到困惑
【问题讨论】:
-
您使用的是 Bot Framework v3 还是 v4?您需要使用来自 Bot Connector 的访问令牌,而不是使用 OAuth 卡检索的用户的访问令牌。
-
我使用的是 v4。我根本无法让 Bot Connector 工作,我猜它不适用于 v4。我将编辑我的帖子以包含我正在使用的版本。
-
我现在正试图让机器人连接器工作。我无法通过 401 Unauthorized。我相信这是因为我的
connectorClient.Credentials有空值。我会发布更多信息。也许这本身就是一个错误,但更有可能是我做错了什么。
标签: c# .net sharepoint botframework