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

如何为DiscoveryClientProtocol.DiscoverAny()请求添加认证头?

为DiscoveryClientProtocol添加自定义认证请求头的解决方案

核心思路

DiscoveryClientProtocol继承自HttpWebClientProtocol,后者提供了可重写的GetWebRequest方法——这是注入自定义请求头的关键入口,无需依赖反射或CookieContainer(后者仅适用于Cookie类认证,与你的场景不匹配)。

实现步骤

1. 自定义DiscoveryClientProtocol子类

创建继承自DiscoveryClientProtocol的子类,重写GetWebRequest方法添加认证头:

public class AuthEnabledDiscoveryClientProtocol : DiscoveryClientProtocol
{
    private readonly string _authHeaderKey;
    private readonly string _authHeaderValue;

    public AuthEnabledDiscoveryClientProtocol(string authHeaderKey, string authHeaderValue)
    {
        _authHeaderKey = authHeaderKey;
        _authHeaderValue = authHeaderValue;
    }

    protected override WebRequest GetWebRequest(Uri uri)
    {
        // 获取基础请求对象
        var baseRequest = base.GetWebRequest(uri);
        // 转换为HttpWebRequest并添加认证头
        if (baseRequest is HttpWebRequest httpRequest)
        {
            httpRequest.Headers.Add(_authHeaderKey, _authHeaderValue);
        }
        return baseRequest;
    }
}

2. 替换原有代码使用自定义类

将原代码中的DiscoveryClientProtocol实例替换为自定义子类,传入你的认证头键值对:

// 示例:假设认证头为Authorization: Bearer {token}
var discoveryClient = new AuthEnabledDiscoveryClientProtocol(
    "Authorization", 
    "Bearer your-cloud-auth-token"
);

discoveryClient.AllowAutoRedirect = true;
discoveryClient.UseDefaultCredentials = true;
discoveryClient.DiscoverAny(serviceDescriptionURL.URL);
discoveryClient.ResolveAll();

为什么CookieContainer不适用

你的场景是需要添加自定义请求头(而非基于Cookie的认证),CookieContainer仅用于管理HTTP Cookie,无法直接生成或添加非Cookie类型的认证头,因此这条路走不通。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:25:10