我一直在尝试解决同样的问题。我正在使用许多 autorest 服务客户端,但必须在每个请求中重新实例化它们以传递特定于用户的客户端凭据。使用 Microsoft.Rest.ClientRuntime 2.3.6,您现在可以使用自己的 HttpClient 实例化 ServiceClient。这使我可以将瞬态 ServiceClient 与单例 HttpClient 一起使用。我只是向生成的 autorest 客户端添加了一个新的构造函数。
public partial class MyClient : ServiceClient<IMyClient>, IMyClient
{
public MyClient(Uri baseUri, ServiceClientCredentials credentials, HttpClient client) : base(client)
{
if (baseUri == null)
{
throw new ArgumentNullException("baseUri");
}
if (credentials == null)
{
throw new ArgumentNullException("credentials");
}
this.Initialize();
this.Credentials = credentials;
Credentials?.InitializeServiceClient(this);
this.BaseUri = baseUri;
}
[...]
}
但是,这会在第一次请求之后导致 ObjectDisposedException。这是因为 ServiceClient 会处理 HttpClients,无论您是否传入它。方法
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
_disposed = true;
// Dispose the client
HttpClient.Dispose();
HttpClient = null;
FirstMessageHandler = null;
HttpClientHandler = null;
}
}
我只是重写了“MyClient”中的 Dispose 方法,什么都不做,因为唯一被释放的对象是 HttpClient。
protected override void Dispose(bool disposing) { }
我没有注意到任何后果,因为 FirstMessageHandler 和 HttpClientHandler 仅在 ServiceClient 为您创建 HttpClient 时才被实例化。这种方法允许我在多个 AutoRest 生成的 ServiceClients 中使用单个 HttpClient,并在每个请求上使用自定义用户凭据。
我很想看看是否有人看到这种方法的任何后果。