До 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 для настройки конечной точки клиента?
В качестве точности я не нашел ни одной опции вмастер для продолжения использования строки в качестве конфигурации конечной точки.