Как внедрить отдельный экземпляр клиента службы WCF в ядро ​​ASP.Net, используя код, сгенерированный dotnet-svcutil? - PullRequest
0 голосов
/ 12 декабря 2018

Контекст:

Мы перенесли наше приложение в 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)
    {
    }
...