.NET Core集成WCF依赖注入问题:添加Header行为后调用异常
解决.NET Core中WCF客户端依赖注入+行为配置的问题
你的问题出在复用了同一个WCF客户端实例:虽然你注册的是Transient,但工厂方法里返回的是提前创建好的同一个client对象,本质上变成了单例。WCF客户端是有状态的,一旦进入FAULT或CLOSED状态就无法再使用,第二次调用自然会失败。
正确的基础注册方式
每次注入时都创建新的客户端实例,并添加行为:
services.AddTransient<IService>(sp => { var client = new ServiceClient(); client.Endpoint.Behaviors.Add(new HeaderInspectionBehavior()); return client; });
这样每次获取IService时都会生成全新的客户端,彻底避免复用已失效的实例。
进阶:添加生命周期管理(推荐)
WCF客户端需要正确释放资源,直接使用原始客户端可能会导致资源泄漏。可以封装一个Wrapper类,实现IService和IDisposable:
public class ServiceClientWrapper : IService, IDisposable { private readonly ServiceClient _innerClient; public ServiceClientWrapper() { _innerClient = new ServiceClient(); _innerClient.Endpoint.Behaviors.Add(new HeaderInspectionBehavior()); } // 实现IService的所有方法,委托给_innerClient public async Task<YourResponse> YourServiceMethodAsync(YourRequest request) { return await _innerClient.YourServiceMethodAsync(request); } public void Dispose() { // 正确处理客户端状态,避免资源泄漏 if (_innerClient.State == CommunicationState.Faulted) { _innerClient.Abort(); } else if (_innerClient.State != CommunicationState.Closed) { _innerClient.Close(); } GC.SuppressFinalize(this); } }
然后注册Wrapper类:
services.AddTransient<IService, ServiceClientWrapper>();
这种方式既保证了每次使用新的客户端实例,又能在Wrapper被回收时正确释放WCF客户端资源,从根源上避免状态异常和资源泄漏问题。
内容的提问来源于stack exchange,提问作者Diego Lobo
相关产品推荐
相关产品推荐

