You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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等现代认证规则:

  1. 先通过NuGet给项目安装Microsoft.SharePointOnline.CSOM依赖包
  2. 参考以下代码实现:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:27:17