能否在MS Project VSTO插件中复用当前用户上下文调用Project Online CSOM/ODATA
在MS Project VSTO插件中复用已登录上下文执行CSOM/ODATA调用
可以复用Project Professional客户端已完成认证的上下文,无需手动设置凭证就能执行CSOM和ODATA调用,核心是获取Project Pro已有的认证令牌或会话Cookie,而非新建无认证的请求。
为什么VBA可以直接复用?
VBA代码运行在Project进程内部,默认共享Project的HTTP会话和认证上下文,所以无需额外配置就能自动带上认证信息;而VSTO插件默认的HTTP请求/CSOM上下文是独立的,需要主动关联Project的认证信息。
具体实现方案
1. ODATA调用(基于Bearer令牌)
利用Project Interop提供的GetProjectServerToken()方法获取当前登录用户的Bearer令牌,直接添加到请求头中:
using System.Net.Http; using System.Net.Http.Headers; using Microsoft.Office.Interop.MSProject; // 获取当前Project应用实例 var projApp = Globals.ThisAddIn.Application; // 获取已登录用户的Bearer令牌 string bearerToken = projApp.GetProjectServerToken(); // 初始化HttpClient并设置认证头 var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken); // 调用ODATA接口示例 var response = await httpClient.GetAsync("https://你的PWA站点地址/sites/pwa/_api/ProjectData/Projects"); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync();
2. CSOM调用(复用Bearer令牌)
通过给ProjectContext的请求事件添加认证头,实现复用已登录上下文:
using Microsoft.ProjectServer.Client; using Microsoft.Office.Interop.MSProject; var projApp = Globals.ThisAddIn.Application; string pwaUrl = "https://你的PWA站点地址/sites/pwa"; string bearerToken = projApp.GetProjectServerToken(); // 初始化ProjectContext var projContext = new ProjectContext(pwaUrl); projContext.FormDigestHandlingEnabled = false; // 给请求添加Bearer认证头 projContext.ExecutingWebRequest += (sender, e) => { e.WebRequestExecutor.RequestHeaders["Authorization"] = $"Bearer {bearerToken}"; }; // 执行CSOM操作示例 projContext.Load(projContext.Projects); await projContext.ExecuteQueryAsync(); // 遍历项目列表 foreach (var project in projContext.Projects) { // 处理项目数据 }
注意事项
GetProjectServerToken()方法仅支持Project Professional 2016及以上版本,且用户已成功登录到Project Online/Server;- 如果遇到令牌过期问题,可以在每次请求前重新获取令牌,或监听Project的登录状态变化事件重新获取。
内容的提问来源于stack exchange,提问作者supriya khamesra
相关产品推荐
相关产品推荐

