Как я могу динамически переключать адреса веб-сервисов в .NET без перекомпиляции?
У меня есть код, который ссылается на веб-службу, и я хотел бы, чтобы адрес этой веб-службы был динамическим (читайте из базы данных, файла конфигурации и т.д.), чтобы он легко менялся. Одно из основных применений этого заключается в развертывании в нескольких средах, где имена машин и IP-адреса различны. Подпись веб-сервиса будет одинаковой во всех развертываниях, только где-то в другом месте.
Возможно, я только что был испорчен мастером Visual Studio "Добавить веб-ссылку" - похоже, что это должно быть что-то относительно простое.
Ответы
Ответ 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>