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

无需调用/sites/root Graph API,如何获取SharePoint hostname?

获取SharePoint站点Hostname的现有实现

我目前通过调用/sites/root Graph API实现了获取hostname的功能,对应的C#代码如下:

public async Task<string> GetHostNameAsync(string token)
{
    var requestUrl = $"https://graph.microsoft.com/v1.0/sites/root";
    var request = new HttpRequestMessage(HttpMethod.Get, requestUrl);
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
    var _httpClient = _httpClientFactory.CreateClient();
    var response = await _httpClient.SendAsync(request);
    var responseContent = await response.Content.ReadAsStringAsync();
    var responseJson = JsonConvert.DeserializeObject<dynamic>(responseContent, _expandoObjectConverter);
    var sharePointSites = responseJson;
    var siteCollection = sharePointSites.siteCollection;
    var hostName = siteCollection.hostname;
    return hostName.ToString();
}

同时在MS Graph Explorer中也能得到对应结果:

Graph Explorer返回结果截图

现咨询:是否存在无需调用该API即可获取hostname的替代方案?


替代方案

1. 从JWT访问令牌中解析

访问Microsoft Graph的Bearer令牌是JWT格式,其中的iss(签发者)字段通常包含SharePoint站点的基础地址,格式类似https://[tenant].sharepoint.com/,可以直接从中提取hostname。

示例C#解析代码:

using System.IdentityModel.Tokens.Jwt;

public string GetHostNameFromToken(string token)
{
    var handler = new JwtSecurityTokenHandler();
    var jwtToken = handler.ReadJwtToken(token);
    var issuerUri = new Uri(jwtToken.Issuer);
    return issuerUri.Host;
}

注意:部分场景下令牌的签发者可能不是直接对应目标站点hostname,需要先验证令牌的受众和签发范围是否匹配你的业务场景。

2. 使用SharePoint CSOM(客户端对象模型)

如果你的应用基于.NET开发,可以通过SharePoint CSOM直接获取站点信息并提取hostname:

using Microsoft.SharePoint.Client;

public string GetHostNameViaCSOM(string siteBaseUrl, string accessToken)
{
    using (var context = new ClientContext(siteBaseUrl))
    {
        context.AuthenticationMode = ClientAuthenticationMode.Anonymous;
        context.FormDigestHandlingEnabled = false;
        context.ExecutingWebRequest += (sender, e) =>
        {
            e.WebRequestExecutor.RequestHeaders["Authorization"] = $"Bearer {accessToken}";
        };
        
        var site = context.Site;
        context.Load(site, s => s.Url);
        context.ExecuteQuery();
        
        return new Uri(site.Url).Host;
    }
}

这种方式需要预先知道站点的基础URL,如果已经持有该URL,也可以直接解析其Host属性,无需调用CSOM接口。

3. 基于租户信息直接构造

如果你的应用绑定固定租户,默认SharePoint站点的hostname通常为[租户名称].sharepoint.com。若已知租户名称,可以直接构造该hostname,但此方法仅适用于默认站点集合,对自定义域名或非默认站点不适用。


内容的提问来源于stack exchange,提问作者user989988

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:43:20