SOAP веб-сервис: много серверов, один интерфейс - PullRequest
2 голосов
/ 11 декабря 2008

У меня есть сценарий, в котором мне понадобится произвольное количество серверов для предоставления одного и того же веб-сервиса SOAP. Я хотел бы сгенерировать один набор прокси-классов и иметь возможность предоставить им местоположение, чтобы указывать их на разных серверах во время выполнения. К сожалению, похоже, что узлу wsdl:port (дочернему элементу wsdl:service) требуется жестко закодировать адрес конкретного сервера. Похоже, что из-за этого URL будет добавлен в мои прокси-классы. Я знаю, что мог бы потенциально изменить это, отредактировав вручную сгенерированные прокси-классы или изменив генерацию кода, но я действительно предпочел бы не прибегать к этому. Я чувствую, что должен быть лучший способ решить эту проблему. Я просто хочу отделить определение интерфейса от местоположения, в котором будет находиться служба. Я использую VS2008 и C # .NET, если это поможет, хотя лучше всего было бы не зависящее от языка (специфическое для SOAP или WSDL) общее решение этой проблемы.

Ответы [ 8 ]

2 голосов
/ 12 декабря 2008

Почему бы вам не распределить нагрузку на веб-серверы, а затем создать запись DNS для IP-адреса с балансировкой нагрузки ... по сути, создав веб-ферму. Это позволит вам ссылаться на имя хоста, а не на статические IP-адреса, и если вам когда-либо понадобится изменить IP-адрес балансировщика нагрузки или веб-серверов, это будет одноразовое изменение. Кроме того, у вас есть резервирование и контроль производительности.

2 голосов
/ 12 декабря 2008

Если вы используете WebReference (pre-WCF) для доступа к веб-службе, вы можете просто установить свойство Url в прокси-классе веб-службы после его создания.

Для WCF вы можете указать другой адрес конечной точки для конструктора прокси-класса, а не использовать значение по умолчанию (среди других возможных решений).

2 голосов
/ 12 декабря 2008

Нет, в .NET вы можете изменить URL во время выполнения.

Service svc = new Service ();
svc.url = "Value read from config. file or some such"
output = svc.method (input);
0 голосов
/ 17 марта 2009

Вот подсказка о том, как определить URL-адрес WSDL. Я просто меняю порт, но, конечно, возможно сделать его более продвинутым.

public class PortChangeReflector : SoapExtensionReflector
{     
    public override void ReflectDescription()
    {
        ServiceDescription description = ReflectionContext.ServiceDescription;
        foreach (Service service in description.Services)
        {
            foreach (Port port in service.Ports)
            {
                foreach (ServiceDescriptionFormatExtension extension in port.Extensions)
                {
                    SoapAddressBinding binding = extension as SoapAddressBinding;
                    if (binding != null && !binding.Location.Contains("8092"))
                    {
                        binding.Location = binding.Location.Replace("92", "8092");
                    }
                }
            }
        }
    }
}

Вставьте это в Add_Code и добавьте следующую ссылку в ваш web.config .

<webServices>
     <soapExtensionReflectorTypes>
          <add type="Dev.PortChangeReflector,App_Code"/>
     </soapExtensionReflectorTypes>
</webServices>

Я надеюсь, что вы можете получить новые идеи об этом.

0 голосов
/ 13 января 2009

Самым простым решением будет использование программного балансировщика нагрузки, такого как HAProxy . При более высокой стоимости вы можете использовать аппаратное решение, такое как Big-IP .

0 голосов
/ 12 декабря 2008
  1. Это для масштабирования (каждый сервер предоставляет одинаковые данные) или
  2. для одного API разные данные на каждом сервере?

Для 2, затем вы можете сделать, как указано выше, просто измените URL службы в коде.

Для 1 вы можете использовать циклический DNS (например, вы видите несколько серверов с типом командной строки nslookup www.google.com).

0 голосов
/ 12 декабря 2008

Клиентские прокси имеют свойство URL, которое вы можете установить во время выполнения. Для упрощения утилита wsdl.exe имеет ключ /appsettingurlkey. Когда вы создаете клиентский прокси, его конструктор проверит ключ в appSettings и соответственно установит URL сервиса. Я считаю, что WCF также имеет эту функцию.

Однако я бы согласился с @Matt и предложил бы считать балансировку нагрузки лучшим решением в долгосрочной перспективе.

0 голосов
/ 11 декабря 2008

Когда вы добавляете веб-ссылку к вашему проекту, адрес веб-службы помещается в файл .config вашего приложения / веб-приложения. Затем вы можете просто изменить этот параметр в файле конфигурации, чтобы он указывал на другое расположение веб-службы, при условии, конечно, что службы идентичны.

...