public static async Task <T> PostAsync <T, S>( this HttpClient httpClient, string serviceName, string virtualPath, string code = null, object body = null, IServiceFinder <S> serviceFinder = null, ILoadBalancer balancer = null) where S : IService { if (serviceName.IsNullOrEmpty()) { throw new AngleExceptions("service name not exits"); } if (virtualPath.IsNullOrEmpty()) { throw new AngleExceptions("virtualPath not exits"); } if (serviceFinder.IsNull()) { throw new AngleExceptions("serviceFinder cannot be null"); } balancer = balancer ?? new WeightRoundBalancer(); var userServices = await serviceFinder.FindByNameAsync(serviceName); var foundedService = default(S); if (!userServices.IsNull() && userServices.Count > 0) { var servicesDictionary = (from us in userServices select new { service = us, weight = us.Weight, }).ToDictionary(x => x.service, y => y.weight); foundedService = balancer.Balance(servicesDictionary); } using (var client = new HttpClient()) { var url = foundedService?.Address.ToString() + virtualPath; if (!code.IsNullOrEmpty()) { client.DefaultRequestHeaders.Add("Authorization", code); } return(await client.PostAsync <T>(url, body)); } }