Как я могу динамически переключать адреса веб-служб в .NET без перекомпиляции?

StackOverflow https://stackoverflow.com/questions/125399

Вопрос

У меня есть код, который ссылается на веб-службу, и я бы хотел, чтобы адрес этой веб-службы был динамическим (считывался из базы данных, файла конфигурации и т.д.), Чтобы его можно было легко изменить.Одним из основных применений этого будет развертывание в нескольких средах, где имена компьютеров и IP-адреса отличаются.Подпись веб-службы будет одинаковой во всех развертываниях, просто расположенная в другом месте.

Возможно, я просто был избалован мастером Visual Studio "Добавить веб-ссылку" - хотя, похоже, это должно быть что-то относительно простое.

Это было полезно?

Решение

Когда вы создаете веб-ссылку и щелкаете по веб-ссылке в обозревателе решений.На панели свойств вы должны увидеть что-то вроде этого:

Web Reference Properties

Изменение значения на dynamic приведет к появлению записи в вашем app.config.

Вот этот Статья CodePlex там больше информации.

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

Если вы действительно настраиваете это динамически, вам следует задать поле .Url экземпляра вызываемого вами прокси-класса.

Установка значения в файле .config из вашей программы:

  1. Это беспорядок;

  2. Может быть не прочитан до следующего запуска приложения.

Если это нужно сделать только один раз за установку, я бы согласился с другими плакатами и использовал файл .config и динамические настройки.

Я знаю, что это старый вопрос, но наше решение намного проще, чем то, что я вижу здесь.Мы используем его для вызовов WCF с VS2010 и выше.Строковый URL-адрес может быть получен из настроек приложения или другого источника.В моем случае это выпадающий список, в котором пользователь выбирает сервер.Служба была настроена через VS add service reference.

private void CallTheService( string url )
{
   TheService.TheServiceClient client = new TheService.TheServiceClient();
   client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);
   var results = client.AMethodFromTheService();
}

Я боролся с этой проблемой в течение нескольких дней, и, наконец, лампочка щелкнула.КЛЮЧОМ к возможности изменять URL веб-сервиса во время выполнения является переопределение конструктора, что я и сделал с помощью частичного объявления класса.Как указано выше, также необходимо установить динамическое поведение URL-адреса.

Это в основном создает оболочку веб-сервиса, где, если вам в какой-то момент потребуется перезагрузить веб-сервис через add service reference, вы не потеряете свою работу.В справке Microsoft по частичным классам специально указано, что одной из причин этой конструкции является создание оболочек веб-служб. http://msdn.microsoft.com/en-us/library/wa80x488 (v=против 100).aspx

// Web Service Wrapper to override constructor to use custom ConfigSection 
// app.config values for URL/User/Pass
namespace myprogram.webservice
{
    public partial class MyWebService
    {
        public MyWebService(string szURL)
        {
            this.Url = szURL;
            if ((this.IsLocalFileSystemWebService(this.Url) == true))
            {
                this.UseDefaultCredentials = true;
                this.useDefaultCredentialsSetExplicitly = false;
            }
            else
            {
                this.useDefaultCredentialsSetExplicitly = true;
            }
        }
    }
}

Измените поведение URL-адреса на "Динамичный".

Пока методы веб-сервиса и лежащие в его основе открытые классы не меняются, это довольно тривиально.В Visual Studio 2005 (и новее) добавление веб-ссылки создает раздел app.config (или web.config для веб-приложений), содержащий этот URL.Все, что вам нужно сделать, это отредактировать файл app.config, чтобы отразить желаемый URL.

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

Просто замечание о разнице между статическим и динамическим.

  • Статический:вы должны устанавливать свойство URL каждый раз, когда вызываете веб-службу.Это потому, что базовый URL-адрес веб-службы if находится в конструкторе прокси-класса.
  • Динамичный:для вас в вашем личном кабинете будет создан специальный конфигурационный ключ. web.config файл.По умолчанию прокси-класс будет считывать URL-адрес из этого ключа.

Если вы извлекаете URL-адрес из базы данных, вы можете вручную присвоить его свойству URL прокси-класса веб-службы.Это следует сделать перед вызовом веб-метода.

Если вы хотите использовать конфигурационный файл, вы можете установить для поведения URL прокси-классов динамическое.

Определенно, использование свойства Url - это правильный путь.Устанавливать ли это в app.config, базе данных или в каком-либо другом месте, зависит от ваших потребностей в настройке.Иногда вы не хотите, чтобы приложение перезапускалось при изменении местоположения веб-службы.Возможно, у вас нет балансировщика нагрузки, масштабирующего серверную часть.Возможно, вы исправляете ошибку веб-службы "горячим путем".В вашей реализации также могут возникнуть проблемы с конфигурацией безопасности.Будь то имена пользователей и пароли рабочей базы данных или даже данные авторизации ws security.Правильное разделение обязанностей может привести вас к некоторым более сложным настройкам конфигурации.

Если вы добавите класс-оболочку вокруг классов, созданных прокси-сервером, вы можете устанавливать свойство Url некоторым унифицированным образом каждый раз, когда вы создаете класс-оболочку для вызова веб-метода.

откройте обозреватель решений

щелкните правой кнопкой мыши веб-сервис и измените поведение URL-адреса на динамическое

нажмите на значок "показать все файлы" в обозревателе решений

в веб-справочнике отредактируйте файл Reference.cs

изменить конструктор

public Service1() {
        this.Url = "URL"; // etc. string  variable this.Url = ConfigClass.myURL
      }

Для меня Ссылка на веб-сервис - это

СПРАВОЧНАЯ ИНФОРМАЦИЯ ПО СЕРВИСУ

.

В любом случае, это очень просто.Как кто-то сказал, вам просто нужно изменить URL-адрес в файле web.config.

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="YourServiceSoap" />
      </basicHttpBinding>
    </bindings>
    <client>
        **** CHANGE THE LINE BELOW TO CHANGE THE URL **** 
        <endpoint address="http://10.10.10.100:8080/services/YourService.asmx"
          binding="basicHttpBinding" bindingConfiguration="YourServiceSoap"
          contract="YourServiceRef.YourServiceSoap" name="YourServiceSoap" />
    </client>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top