Bot Framework v3.11.0在Skype频道无法上传文本文件求助
解决Skype频道中Bot Framework v3.11.0文本附件上传问题
我明白你遇到的困扰——在Bot Framework模拟器里正常运行的附件上传功能,到Skype频道就抛出404错误。这是因为Skype频道并不支持Bot Framework的UploadAttachmentAsync API,这个接口主要适配Teams等其他支持该功能的频道,Skype有自己独立的附件处理逻辑。
下面给你两种可行的解决方案,都能让用户在Skype客户端内直接查看或下载文本附件:
方案1:直接将文本内容嵌入附件
这种方法适合小体积的文本文件,不需要依赖外部存储,直接把文件内容作为附件的Content字段返回。修改后的代码如下:
public static async Task<Activity> GetTextAttachmentAsync(Activity message) { var reply = message.CreateReply("Here is a text attachment"); // 下载文本文件内容 byte[] fileData = null; using (var wc = new System.Net.WebClient()) fileData = wc.DownloadData("https://textfiles.com/100/adventur.txt"); // 将字节数组转为字符串(根据文件实际编码调整,这里默认用UTF-8) string textContent = System.Text.Encoding.UTF8.GetString(fileData); // 直接构造附件,跳过Skype不支持的UploadAttachmentAsync流程 reply.Attachments = new List<Attachment> { new Attachment { Name = "adventur.txt", ContentType = "text/plain", // 如果是HTML文件可改为"text/html" Content = textContent // 直接把文本内容作为附件核心内容 } }; return reply; }
改动说明:
- 移除了
ConnectorClient和UploadAttachmentAsync相关逻辑,避免调用Skype不兼容的API - 将下载的字节数组转为字符串,直接赋值给附件的
Content字段 - 调整了附件名称和ContentType,确保Skype能正确识别并展示内容
方案2:使用公开可访问的文件URL
如果你的文本文件体积较大,或者需要用户直接下载原始文件,可以把文件上传到公开存储服务(比如Azure Blob Storage),然后将公开URL作为附件的ContentUrl:
public static async Task<Activity> GetTextAttachmentAsync(Activity message) { var reply = message.CreateReply("Here is a text attachment"); // 假设你已将文件上传至公开存储,获取到可直接访问的URL string publicFileUrl = "https://your-public-storage-service/adventur.txt"; reply.Attachments = new List<Attachment> { new Attachment { Name = "adventur.txt", ContentType = "text/plain", ContentUrl = publicFileUrl } }; return reply; }
注意事项:
- 确保文件URL是公开可访问的,Skype客户端需要能直接获取到文件内容
- 如果使用Azure Blob Storage,需将Blob的访问级别设置为"公开读取"
这两种方法都能在Skype频道中正常工作,用户可以直接在客户端内查看附件内容,或者点击下载原始文件。
内容的提问来源于stack exchange,提问作者Nitin K




