我已将旧库转换为.NET Core并实现了ChannelFactory缓存解决方案。它连接的服务需要向每个请求的HTTP头添加基本授权。使用ClientMesageInspector将标头添加到每个请求中。因为ClientMessageInspector在创建第一个通道后是不可变的,所以ChannelFactory缓存将每个实例存储在一个字典中,其中包含一个基于ChannelFactory端点,用户名和密码组合的键。此外,由于创建ChannelFactory的开销,我不会丢弃它们。我担心的是用户名和密码保存在字典键内的内存中,也存放在添加到ChannelFactory的ClientMesageInspector中。有更好的解决方案吗?我已经在dotnet / wcf GitHub page上提出了这个问题,并希望向更多的观众开放。
提前致谢。
鲍勃。
答案 0 :(得分:0)
我通过我的question获得了dotnet / wcf团队的大力帮助。 经过一番讨论后,我最终使用AsyncLocal变量来存储用户名和密码。
在包装器类中,我们有两个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;
}