Контекст:
Мы перенесли наше приложение в ASP.Net Core 2.1 и получили все «работающее», но столкнулись с проблемами производительности при большой нагрузке.После долгих поисков я нашел эту статью , а затем эту , в которой предлагалось использовать один экземпляр HttpClient
.Поскольку мы подключаемся к нескольким службам WCF и внедряем их, используя AddScoped
, я решил, что, возможно, нам нужно сделать то же самое для наших клиентов WCF.
Вот как мы внедряем клиента службы WCF в методе ConfigureServices
:
services.AddScoped<IWCFService>(s =>
new WCFServiceClient(
binding,
new EndpointAddress(Configuration[$"ServiceEndPoints:WCFUrl"])
));
других найденных мной решений для инъекции WCFклиентские прокси-серверы также используют AddScoped
, поэтому я мог бы пойти по кроличьей норе с этим.
Мы также скопировали / вставили сгенерированные клиентские прокси-серверы, потому что VisualStudio немного глючил в области «ConnectedServices», но яс тех пор как это работает.Я не думаю, что это было моей проблемой производительности, но я полагаю, что это может быть.
Вопрос (ы):
Является ли dotnet-svcutil
сгенерированный "клиент" таким же, как HttpClient
?Я не думаю, что это так, но, возможно, он подвержен тем же узким местам ресурсов и должен рассматриваться одинаково?И если это так, как можно внедрить единственный экземпляр «клиента» в сгенерированный прокси-код?Доступные конструкторы не принимают ничего подобного.
Пример конструкторов:
public WCFServiceClient() :
base(WCFServiceClient.GetDefaultBinding(), WCFServiceClient.GetDefaultEndpointAddress())
{
this.Endpoint.Name = EndpointConfiguration.CustomBinding_IWCFService.ToString();
ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
}
public WCFServiceClient(EndpointConfiguration endpointConfiguration) :
base(WCFServiceClient.GetBindingForEndpoint(endpointConfiguration), WCFServiceClient.GetEndpointAddress(endpointConfiguration))
{
this.Endpoint.Name = endpointConfiguration.ToString();
ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
}
public WCFServiceClient(EndpointConfiguration endpointConfiguration, string remoteAddress) :
base(WCFServiceClient.GetBindingForEndpoint(endpointConfiguration), new System.ServiceModel.EndpointAddress(remoteAddress))
{
this.Endpoint.Name = endpointConfiguration.ToString();
ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
}
public WCFServiceClient(EndpointConfiguration endpointConfiguration, System.ServiceModel.EndpointAddress remoteAddress) :
base(WCFServiceClient.GetBindingForEndpoint(endpointConfiguration), remoteAddress)
{
this.Endpoint.Name = endpointConfiguration.ToString();
ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
}
public WCFServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
base(binding, remoteAddress)
{
}