Как настроить конечные точки при создании клиента SOAP с VS 2019? - PullRequest
2 голосов
/ 21 июня 2019

До 2019 года

Я использовал для генерации клиентов для использования служб WCF с Visual Studio 2017 или Rider (поведение такое же).Что происходит, так это то, что сгенерированный клиент наследует System.ServiceModel.ClientBase, и я могу передать конфигурацию конечной точки этому ClientBase через сгенерированный клиент.Сгенерированный код выглядит следующим образом:

public partial class GeneratedSoapClient : ClientBase<GeneratedSoapClient>
{
    public GeneratedSoapClient (string endpointConfigurationName) : 
            base(endpointConfigurationName)
    {
    }

    // ...
}

Это позволяет добавить некоторые конечные точки в хосте app.config:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="MySoap" />
    </basicHttpBinding>
  </bindings>
  <client>
    <endpoint address="http://dev.my_service.net?asmx"
              binding="basicHttpBinding" bindingConfiguration="MySoap"
              name="MyService_Dev" />

    <endpoint address="http://prod.my_service.net?asmx"
              binding="basicHttpBinding" bindingConfiguration="MySoap"
              name="MyService_Prod" />
  </client>
</system.serviceModel>

Затем я создаю свой клиент либо с помощью "MyService_Dev", либо * 1013.* для вызова службы dev или prod.

После 2019 года

В Visual Studio 2019 генерация кода отличается.Он не генерирует файлы svcmap и webref.Вместо этого он генерирует один файл json с информацией.

В коде C # сгенерированный клиент больше не принимает конфигурацию конечной точки в виде строки, теперь он принимает перечисление и затем разрешаетКонечная точка непосредственно в коде:

public enum EndpointConfiguration
{
    ServiceHttpSoap11Endpoint,
    ServiceHttpSoap12Endpoint,
}

class GeneratedSoapClient : ClientBase<GeneratedSoapClient>
{
    public GeneratedSoapClient(EndpointConfiguration endpointConfiguration) :
        base(/* Binding, not related to my issue*/, GetEndpointAddress(endpointConfiguration))
    {
    }

    private static GetEndpointAddress(EndpointConfiguration endpointConfiguration)
    {
        if (endpointConfiguration == EndpointConfiguration.ServiceHttpSoap11Endpoint)
        {
            return new EndpointAddress("http://prod.my_service.net?asmx");
        }
        if (endpointConfiguration == EndpointConfiguration.ServiceHttpSoap12Endpoint)
        {
            return new EndpointAddress("http://prod.my_service.net?asmx");
        }
        throw new System.InvalidOperationException(string.Format("Could not find endpoint with name \'{0}\'.", endpointConfiguration));
    }
}

В этой ситуации я не могу настроить свою собственную конечную точку, потому что я предпочитаю не изменять сгенерированный код, поскольку это плохая практика.Потребуется применить один и тот же «патч» после регенерации каждый раз, когда меняется контракт.В этой ситуации

Как использовать новейший клиентский генератор WCF для настройки конечной точки клиента?

В качестве точности я не нашел ни одной опции вмастер для продолжения использования строки в качестве конфигурации конечной точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...