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

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

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

Ответы [ 11 ]

52 голосов
/ 24 сентября 2008

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

Web Reference Properties

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

Вот статья CodePlex , в которой содержится дополнительная информация.

30 голосов
/ 24 сентября 2008

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

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

  1. Беспорядок;

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

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

16 голосов
/ 30 ноября 2016

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

private void CallTheService( string url )
{
   TheService.TheServiceClient client = new TheService.TheServiceClient();
   client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);
   var results = client.AMethodFromTheService();
}
6 голосов
/ 27 июня 2013

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

Это в основном создает оболочку веб-службы, в которой, если вам нужно в какой-то момент перезагрузить веб-службу, через ссылку на службу, вы не потеряете свою работу. В справке Microsoft по частичным классам специально указывается, что одной из причин этой конструкции является создание упаковщиков веб-служб. http://msdn.microsoft.com/en-us/library/wa80x488(v=vs.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;
            }
        }
    }
}
5 голосов
/ 24 сентября 2008

Изменить поведение URL на " Динамический ".

4 голосов
/ 24 сентября 2008

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

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

2 голосов
/ 24 сентября 2008

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

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

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

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

1 голос
/ 24 сентября 2008

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

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

0 голосов
/ 11 мая 2016

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

ОБСЛУЖИВАНИЕ

.

Во всяком случае, это очень легко. Как кто-то сказал, вам просто нужно изменить 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...