Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Web Reference Properties

Изменение значения в динамическом режиме приведет к записи в файл app.config.

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

Ответ 2

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

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

  • Это беспорядок,

  • Невозможно прочитать до запуска следующего приложения.

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

Ответ 3

Измените поведение URL на " Dynamic".

Ответ 4

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

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

Ответ 5

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

В основном это создает оболочку веб-сервиса, где, если вам нужно перезагрузить веб-службу в какой-то момент, добавив ссылку на службу, вы не потеряете свою работу. В справочной системе Microsoft для классов Partial указано, что часть причины этой конструкции заключается в создании оберток веб-сервисов. 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;
            }
        }
    }
}

Ответ 6

Я знаю, что это старый вопрос, но наше решение намного проще, чем то, что я вижу здесь. Мы используем его для вызовов 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();
}

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

open solition explorer

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

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

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

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

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

Ответ 11

Для меня ссылкой на WebService является

ССЫЛКА ОБСЛУЖИВАНИЯ

.

В любом случае это очень легко. Как сказал кто-то, вам просто нужно изменить 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>