如何为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
相关产品推荐
相关产品推荐

