Как я могу динамически переключать адреса веб-служб в .NET без перекомпиляции?
-
02-07-2019 - |
Вопрос
У меня есть код, который ссылается на веб-службу, и я бы хотел, чтобы адрес этой веб-службы был динамическим (считывался из базы данных, файла конфигурации и т.д.), Чтобы его можно было легко изменить.Одним из основных применений этого будет развертывание в нескольких средах, где имена компьютеров и IP-адреса отличаются.Подпись веб-службы будет одинаковой во всех развертываниях, просто расположенная в другом месте.
Возможно, я просто был избалован мастером Visual Studio "Добавить веб-ссылку" - хотя, похоже, это должно быть что-то относительно простое.
Решение
Когда вы создаете веб-ссылку и щелкаете по веб-ссылке в обозревателе решений.На панели свойств вы должны увидеть что-то вроде этого:
Изменение значения на dynamic приведет к появлению записи в вашем app.config.
Вот этот Статья CodePlex там больше информации.
Другие советы
Если вы действительно настраиваете это динамически, вам следует задать поле .Url экземпляра вызываемого вами прокси-класса.
Установка значения в файле .config из вашей программы:
Это беспорядок;
Может быть не прочитан до следующего запуска приложения.
Если это нужно сделать только один раз за установку, я бы согласился с другими плакатами и использовал файл .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>