.NET Core 2.2 API调用SharePointOnline CSOM报“无程序包标识”错误
这个问题我之前帮不少开发者排查过,0x80073D54(进程没有包标识)的本质是SharePoint CSOM在.NET Core环境下误触发了UWP应用的身份校验逻辑——毕竟CSOM最初是为.NET Framework设计的,在跨平台/非桌面服务器环境下存在兼容性盲区。结合你的场景,我整理了几个针对性的解决方案:
1. 升级CSOM包到.NET Core兼容版本
旧版本的Microsoft.SharePointOnline.CSOM是基于.NET Framework开发的,在.NET Core环境下会调用一些仅UWP支持的API,从而抛出这个异常。你需要:
- 卸载当前的CSOM包
- 安装支持.NET Standard 2.0及以上的最新版CSOM(推荐版本:16.0.24119.12000+),这些版本专门修复了.NET Core环境下的身份认证逻辑问题。
2. 修正异步调用的方式
你当前用.Wait()同步阻塞异步方法,这不仅容易导致死锁,还会放大CSOM的兼容性问题。请将代码改为标准的async/await模式:
修改SharePointHelper类的方法:
using Microsoft.SharePoint.Client; using System.Collections.Generic; using System.Threading.Tasks; namespace SharePointHelper { public class SharePointHelper { public SharePointHelper() { } // 改为async Task方法 public async Task WriteFilesAndFoldersAsync(string siteUrl, string listName, string username, string password) { using (var context = new ClientContext(siteUrl)) { context.Credentials = new SharePointOnlineCredentials(username, password); var folder = context.Web.GetFolderByServerRelativeUrl(listName); var subFolders = folder.Folders; var files = folder.Files; context.Load(folder); context.Load(subFolders); context.Load(files); if (context.HasPendingRequest) await context.ExecuteQueryAsync(); // 用await替代.Wait() PrintValues(subFolders.GetEnumerator()); PrintValues(files.GetEnumerator()); } } private void PrintValues(IEnumerator<Folder> enumerator) { while (enumerator.MoveNext()) Console.WriteLine(enumerator.Current.Name); } private void PrintValues(IEnumerator<File> enumerator) { while (enumerator.MoveNext()) Console.WriteLine(enumerator.Current.Name); } } }
修改API调用代码:
// 同样改为async Task方法 public async Task SharePointTestAsync() { string siteUrl = @"https://somecompany.sharepoint.com/sites/Test"; string listName = "Documents"; string username = "myemail@somecompany.com"; string password = "mypassword"; var sharePointHelper = new SharePointHelper.SharePointHelper(); await sharePointHelper.WriteFilesAndFoldersAsync(siteUrl, listName, username, password); }
3. 替换为更兼容的认证方式
如果升级包和调整异步模式后仍有问题,建议放弃SharePointOnlineCredentials,改用Azure AD应用权限认证,配合PnP Framework(对.NET Core支持更完善):
- 安装
PnP.FrameworkNuGet包 - 修改代码使用应用身份认证:
using PnP.Framework; using System.Collections.Generic; using System.Threading.Tasks; namespace SharePointHelper { public class SharePointHelper { public async Task WriteFilesAndFoldersAsync(string siteUrl, string listName, string clientId, string clientSecret) { // 使用PnP的AuthenticationManager创建上下文 using (var context = await new AuthenticationManager().GetACSAppContextAsync(siteUrl, clientId, clientSecret)) { var folder = context.Web.GetFolderByServerRelativeUrl(listName); var subFolders = folder.Folders; var files = folder.Files; context.Load(folder); context.Load(subFolders); context.Load(files); await context.ExecuteQueryAsync(); PrintValues(subFolders.GetEnumerator()); PrintValues(files.GetEnumerator()); } } // 打印方法不变... } }
这种方式不需要用户名密码,而是通过Azure AD应用的客户端ID和密钥进行认证,更适合服务器端场景,彻底规避了SharePointOnlineCredentials的兼容性问题。
4. 检查服务器环境配置
确保Windows Server 2012 R2满足以下条件:
- 安装了最新的.NET Core 2.2 Runtime补丁(注意:.NET Core 2.2已停止官方支持,若长期维护建议升级到.NET 6+)
- 安装了所有必要的Windows更新,尤其是与UWP底层组件相关的补丁(CSOM可能依赖这些组件的基础库)
内容的提问来源于stack exchange,提问作者EggBender
相关产品推荐
相关产品推荐

