Загрузить службу WCF по среде в основном проекте .net

У меня возникла проблема при добавлении 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 как промежуточное ПО.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
16
0
12 745
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Используйте 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;
        });

Может быть, не самый лучший, но работает нормально.

Привет! Не могли бы вы также рассказать, как вы тогда звоните в WS. Я добавил упомянутый вами код. Я подтвердил, что новый URL-адрес получен из настроек приложения. Но когда в моем коде я хочу выполнить метод ws сначала DemoServiceClient client = new DemoServiceClient (); Я проверяю переменный адрес клиента, он все еще использует исходный URL-адрес, а не тот, который указан в appsettings. Спасибо!

Benk 21.11.2018 01:47

Как я понял из Эта статья, это рекомендация Microsoft:

  1. Добавить новый файл класса
  2. Добавить такое же пространство имен службы reference.cs
  3. Добавьте частичный класс, чтобы расширить ссылочный сервисный класс (объявленный в Reference.cs)
  4. И частичный метод для реализации ConfigureEndpoint () (объявлен в Reference.cs)
  5. Реализуйте метод 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(""));
        }
    }
}
  1. Здесь вы можете взять значение из файла 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.

Заранее спасибо.

Другие вопросы по теме