У меня возникла проблема при добавлении WCF в основной проект .NET.
Когда я раньше использовал .net, я мог добавить несколько сред в web.config
, чтобы загружать нужную веб-службу во время выполнения (Dev, Rec, Prod).
Проблема в основном проекте .net, когда я добавил ссылку на свою службу WCF как подключенную службу, он создал один файл ConnectedService.json, содержащий URL-адрес службы WCF.
{
"ProviderId": "Microsoft.VisualStudio.ConnectedService.Wcf",
"Version": "15.0.20406.879",
"GettingStartedDocument": {
"Uri": "https://go.microsoft.com/fwlink/?linkid=858517"
},
"ExtendedData": {
"Uri": "*****?singleWsdl",
"Namespace": "Transverse.TokenService",
"SelectedAccessLevelForGeneratedClass": "Public",
"GenerateMessageContract": false,
"ReuseTypesinReferencedAssemblies": true,
"ReuseTypesinAllReferencedAssemblies": true,
"CollectionTypeReference": {
"Item1": "System.Collections.Generic.List`1",
"Item2": "System.Collections.dll"
},
"DictionaryCollectionTypeReference": {
"Item1": "System.Collections.Generic.Dictionary`2",
"Item2": "System.Collections.dll"
},
"CheckedReferencedAssemblies": [],
"InstanceId": null,
"Name": "Transverse.TokenService",
"Metadata": {}
}
}
Мой вопрос, как я могу загрузить правильный сервис в зависимости от используемой среды.
Примечание.
В моем проекте у меня не было ни appsettings
, ни веб-конфигурации. Это библиотека базовых классов .net, которая называется в базовом приложении ASP.NET как промежуточное ПО.
Используйте ChannelFactory
, чтобы пользоваться вашим сервисом.
WCF ChannelFactory против создания прокси
ChannelFactory
позволяет установить EndpointAddress
.
Как: использовать ChannelFactory
URL-адрес конечной точки можно загрузить из файла конфигурации. При более продвинутой настройке можно выполнить поиск в каталоге для службы, чтобы получить URL-адрес среды, в которой развернуто приложение. https://en.wikipedia.org/wiki/Service_provider_interface
https://github.com/jolmari/netcore-wcf-service-proxy
Example of consuming multiple WCF services using a proxy implementation in a ASP.NET Core Web-application.
Для кого интересует решение Я добавил конечную точку для своей службы в каждом приложении. {Environment} .json и в классе службы я добавляю новый экземпляр моей службы на основе переменной среды ASPNETCORE_ENVIRONMENT
services.AddTransient<Transverse.TokenService.ITokenService>(provider =>
{
var client = new Transverse.TokenService.TokenServiceClient();
client.Endpoint.Address = new System.ServiceModel.EndpointAddress(Configuration["Services:TokenService"]);
return client;
});
Может быть, не самый лучший, но работает нормально.
Как я понял из Эта статья, это рекомендация Microsoft:
ConfigureEndpoint()
, задав новое значение для конечной точкиПример:
namespace Your_Reference_Service_Namespace
{
public partial class Your_Reference_Service_Client
{
static partial void ConfigureEndpoint(System.ServiceModel.Description.ServiceEndpoint serviceEndpoint, System.ServiceModel.Description.ClientCredentials clientCredentials)
{
serviceEndpoint.Address =
new System.ServiceModel.EndpointAddress(new System.Uri("http://your_web_service_address"),
new System.ServiceModel.DnsEndpointIdentity(""));
}
}
}
Здесь вы можете взять значение из файла appsettings.json
новый System.Uri (configuration.GetValue ("yourServiceAddress")
Я использую .Net Core 3.1, это мой способ, когда я вызываю службу WCF.
var sUserClientRemoteAddress = _configuration.GetValue<string>("WCFRemoteAddress:UserClient");
UserClient userService = new UserClient(UserClient.EndpointConfiguration.CustomBinding_IUser, sUserClientRemoteAddress);
Сначала получите удаленный адрес конечной точки из appsettings.json.
Во-вторых, вызовите клиент веб-службы, используя этот адрес в параметре CTOR WCF Client Class.
Заранее спасибо.
Привет! Не могли бы вы также рассказать, как вы тогда звоните в WS. Я добавил упомянутый вами код. Я подтвердил, что новый URL-адрес получен из настроек приложения. Но когда в моем коде я хочу выполнить метод ws сначала DemoServiceClient client = new DemoServiceClient (); Я проверяю переменный адрес клиента, он все еще использует исходный URL-адрес, а не тот, который указан в appsettings. Спасибо!