Клиент веб-сервиса .NET из WSDL

#c# #web-services

#c# #веб-сервисы

Вопрос:

У меня есть WSDL, из которого я сгенерировал реализацию клиентской базы, а именно MyService

 
function void updateData(Data data){
   BasicHttpBinding binding = new BasicHttpBinding();
    // see there is naked username and password.           
   EndpointAddress address = new EndpointAddress("http://qa.farwaha.com/eai_enu/start.swe?SWEExtSource=WebServiceamp;SWEExtCmd=Executeamp;UserName=johnamp;Password=johspassword");
   MyService service = new MyService(binding, address);
   try{
     service.update(data);
   }finally{
     service.close();
   }
}
  

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

Учитывая, что это приложение Winform.

  1. Насколько интенсивно использование памяти / процессора при создании объекта MyService?

  2. Если вы предложите обналичить сервис, он сохранит адрес конечной точки; у какого стажера есть строка с именем пользователя и паролем. Что не очень хорошая идея .. есть какие-нибудь обходные пути?

  3. Если я сохраню код как таковой, объект service будет собран как мусор .. и не будет никаких следов имени пользователя или пароля (как только GC запустится)

Это пример кода, у меня есть объект User, который хранит пароль в SecureString, и каждый раз, когда мне нужно получить доступ к паролю; я получаю строку из SecureString в частном методе экземпляра, быстро использую ее и оставляю ее для сбора мусора. Я полагаю, что если я использую метод, подобный описанному выше, это будет безопасно или достаточно безопасно, вместо того, чтобы цепляться за ссылку на сервис, что вы предлагаете !!

Комментарии:

1. Что-то кажется неправильным в ситуации, которую вы описываете. Вызов службы со значениями (имя пользователя, пароль, …) в строке запроса, похоже, подходит для службы на основе REST. Вы говорите, что вызываемая вами служба предоставляет WSDL, поэтому, похоже, это служба на основе soap. У вас не может быть обеих схем вызова, потому что служба soap будет иметь доступ только к чему-либо в конверте soap и игнорировать значения строки запроса. Не могли бы вы уточнить, действительно ли это сервис на основе soap? Спасибо!

2. @Sixto это действительно веб-сервис на основе SOAP. Я проверю то, что вы предложили, это имеет смысл. Спасибо за ваш вклад.

Ответ №1:

На ваши конкретные вопросы:

  1. В вашем клиентском коде вы создаете экземпляры облегченных прокси-классов, которые оборачивают инфраструктуру канала, которая сериализует сообщения в / из конечных точек сервиса. Как таковые, эти клиентские прокси-классы дешевы и быстры в создании, потому что они обычно мало что делают, пока вы на самом деле не отправите что-либо в службу. Следует остерегаться одной вещи, когда вы вызываете службы, которые используют более сложную схему безопасности — установление соединений с такими службами может быть дорогостоящим, и поэтому стоит кэшировать или повторно использовать такие соединения, если вы можете.
  2. «Какие-либо обходные пути»? Нет! Увы, служба, которую вы используете, плохо спроектирована — они не только требуют предоставления имени пользователя и пароля как части вызова метода службы, но и требуют, чтобы вы передавали их в открытом виде по HTTP. Возможно, вы захотите попросить их, по крайней мере, предоставить конечную точку SSL, чтобы имя пользователя и пароль могли быть защищены во время передачи. Что еще лучше, они могли бы реализовать basic-auth, чтобы позволить вам получать файлы cookie HTTP auth, которые вы можете прикреплять к последующим вызовам их сервисов.
  3. Да, GC в конечном итоге очистит ваши прокси-экземпляры. Еще лучше, вы могли бы обернуть свои экземпляры в using инструкции, чтобы вызвать шаблон Dispose и выполнить детерминированную очистку. Смотрите мой сервис WCF Magic8Ball на Codeplex для примеров.

Другие наблюдения:

  1. Поскольку вашему сервису требуется ваше имя пользователя и пароль, каждый раз, когда вы вызываете его, вам нужно очень тщательно продумать, как вы собираетесь получить и сохранить имя пользователя и пароль.
  2. Я бы настоятельно рекомендовал вам указывать информацию о привязке в app.config, а не встроенную в ваш код. Опять же, смотрите Службу WCF Magic8Ball: если вы создаете привязки в коде и конечная точка изменяется или если они открывают новую конечную точку, протокол, кодировку и / или привязку, вам придется перекомпилировать и переделать все ваше приложение. Если вы укажете свои привязки в config, возможно, вам просто удастся отправить обновленное app.config.

Надеюсь, это поможет.

Комментарии:

1. Вам следует пересмотреть обертывание вашего клиентского объекта в «using». В этом посте есть хорошее объяснение, почему вы не должны: danrigsby.com/blog/index.php/2008/02/26 /…