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


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

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

11 53

11 ответов:

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

Web Reference Properties

изменение значения на динамическое приведет к появлению записи в вашем приложении.конфиг.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

открыть solition explorer

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

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

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

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

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

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

ССЫЛКА НА СЛУЖБУ

.

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

<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>