在 ChannelFactory 缓存中管理凭据

Managing Credentials Within ChannelFactory Cache

我已将旧库转换为 .NET Core 并实施了 ChannelFactory 缓存解决方案。它连接的服务需要将基本授权添加到每个请求的 HTTP headers。 header 使用 ClientMesageInspector 添加到每个请求。因为 ClientMessageInspector 在创建第一个通道后是不可变的,所以 ChannelFactory 缓存将每个实例存储在一个字典中,其中包含一个基于 ChannelFactory 端点、用户名和密码组合的键。此外,由于创建 ChannelFactory 的开销,我不会处理它们。我担心的是用户名和密码保存在字典键内的内存中,也保存在添加到 ChannelFactory 的 ClientMesageInspector 中。有更好的解决方案吗?我已经在 dotnet/wcf GitHub page 上问过这个问题,并希望将其公开给更多的观众。

提前致谢。

鲍勃

我的 question 得到了 dotnet/wcf 团队的大力帮助。 经过一番讨论后,我最终使用 AsyncLocal 变量来存储用户名和密码。

在包装器 class 中,我们有两个通过构造函数设置的 AsyncLocal 变量。

internal static AsyncLocal<string> Username = new AsyncLocal<string>();
internal static AsyncLocal<string> Password = new AsyncLocal<string>();

public WCFWrapper(string username, string password) : this()
{
    Username.Value = username;
    Password.Value = password;
}

在 IClientMessageInspector BeforeSendRequest 方法中,我们简单地使用变量。

public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
    HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();
    httpRequestProperty.Headers[System.Net.HttpRequestHeader.Authorization] =  
        "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(WCFWrapper.Username.Value + ":" + WCFWrapper.Password.Value));
    request.Properties[HttpRequestMessageProperty.Name] = httpRequestProperty;

    return null;
}