使用VB.Net从SharePoint下载Excel文件报错问题排查
问题根源
两个报错核心原因和代码逻辑无关,出在链接格式和认证方式不匹配:
- 你当前使用的带
?d=xxx&csf=1&web=1参数的链接是SharePoint网页端预览链接,不是直链文件地址,直接请求会跳转到微软登录认证页,无有效认证的请求要么拿到空的登录页跳转内容(即你看到的0KB文件),要么直接被拦截返回403。 My.Computer.Network.DownloadFile直接传账号密码的基础认证方式,对默认开启现代认证(MFA/ADAL)的SharePoint Online完全无效,微软早已在2021年后默认禁用租户的基础认证权限。- 裸调用
WebClient不带任何认证凭据、也没做请求头伪装的请求,会被SharePoint判定为未授权匿名请求,直接返回403。
可行解决方案
第一步:转换链接为直链下载地址
把现有URL中的:x:/r/字段替换为:x:/b/,再在URL末尾拼接&download=1参数,处理后的链接格式如下:
https://xxxxxxx.sharepoint.com/:x:/b/sites/Engineering_tools/Automation_Master.xlsm?d=webeecea430dc4311b99ccefc1a1faf08&csf=1&web=1&e=ETgkgf&download=1
注意:如果分享链接设置为仅限组织内授权用户访问、未开匿名权限,就算改完下载链接,不带有效认证请求依然会返回403。
第二步:根据链接权限选对应下载方式
方案1:链接开了匿名/任何人可访问权限
改完直链后直接用加了浏览器UA头的WebClient即可下载,避免被反爬规则拦截:
Imports System.Net Dim myURL As String = "替换后的直链下载地址" Dim fileLocation As String = "C:\temp\UI_Ouput\CWE_Design_Automation\HBU3_Automation_Master.xlsm" Using webClient As New WebClient() ' 伪装常规浏览器请求头 webClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") webClient.DownloadFile(myURL, fileLocation) End Using
方案2:链接仅限组织内用户访问
不要用直接传明文账号密码的基础认证方式,用官方CSOM SDK做认证下载,兼容MFA等现代认证规则:
- 先通过NuGet给项目安装
Microsoft.SharePointOnline.CSOM依赖包 - 参考以下代码实现:
Imports Microsoft.SharePoint.Client Imports System.IO Imports System.Security Dim siteUrl As String = "https://xxxxxxx.sharepoint.com/sites/Engineering_tools/" Dim fileRelativeUrl As String = "/sites/Engineering_tools/Automation_Master.xlsm" Dim fileLocation As String = "C:\temp\UI_Ouput\CWE_Design_Automation\HBU3_Automation_Master.xlsm" Dim userName As String = "user@abc.com" Using context As New ClientContext(siteUrl) Dim passWord As New SecureString() For Each c As Char In "你的账号密码".ToCharArray() passWord.AppendChar(c) Next context.Credentials = New SharePointOnlineCredentials(userName, passWord) Dim file As File = context.Web.GetFileByServerRelativeUrl(fileRelativeUrl) context.Load(file) context.ExecuteQuery() Dim fileInfo As FileInformation = File.OpenBinaryDirect(context, file.ServerRelativeUrl) Using fileStream As New FileStream(fileLocation, FileMode.Create) fileInfo.Stream.CopyTo(fileStream) End Using End Using
常见踩坑说明
- 不要直接复制浏览器地址栏的预览链接做下载,这类链接返回的是网页预览框架代码,不是文件二进制流。
- 所有下载请求都建议加常规浏览器的User-Agent头,SharePoint会默认拦截无合法UA的客户端请求。
- 如果你的账号开启了强制MFA验证,CSOM方案会自动弹出交互式认证窗口完成校验,不需要硬编码密码。
内容的提问来源于stack exchange,提问作者Ashutosh Gupta
相关产品推荐
相关产品推荐

