2011-01-24 3 views
8

Я пытаюсь написать код на C#, который будет называть службу WCF «на лету», импортируя WSDL, исследуя его, а затем динамически вызывает вызовы.Вызов службы WCF без генерации сборки

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

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

Изложенные здесь: Creating an assembly on the fly from a WSDL

Я хотел бы избежать образования сборки, а затем размышляя над ним, если это возможно.

Я просмотрел код динамического прокси в ссылке, и они используют класс framework для импорта. Этот класс является WsdlImporter. Поэтому я подумал, что я могу использовать это и изучить схему WSDL и определить, какие вызовы присутствуют и какие входы и выходы доступны.

Проблема в том, что информация о типе отсутствует в объектах MessagePartDescription, которые создает WsdlImporter. По-видимому, этого не хватает because it cannot find the types yet - see the response to the question from Brian.

Значит, любой совет о том, как я должен действовать? Неужели я полностью ошибаюсь?

+0

Можете ли вы дать реальный пример того, как это было бы полезно? Есть ли пользовательский интерфейс, представленный пользователю вашего клиента, который позволяет им выбирать методы для вызова, возможно, какой-то планировщик или что-то еще? Кроме того, что не так с созданием сборки на лету? Это звучит довольно просто. Представляете ли вы что-то более простое, чем размышление? Мне трудно понять, что это будет. – JohnOpincar

+1

Это будет использоваться для вызова службы WF. Рабочий процесс может измениться - шаги могут быть добавлены/удалены и т. Д. – Neil

+0

@JohnOpincar - Мое возражение не в отражении - это на сборку сборки на лету. Кажется, что это подход, который может вызвать проблемы безопасности в какой-то момент, и * может быть хрупким. Также мне кажется странным, что когда вся информация находится в WSDL, и учитывая, что в конечном итоге вызовы будут распределяться через нечто, похожее на динамический API, который создает динамический слой с отражением поверх статического слоя, который был динамически создан, который затем отображается на динамический слой, немного. Создание сборки «на лету» - это мой план резервного копирования. – Neil

ответ

5

Это, вероятно, не ответ, но я отправлю его как один, чтобы полностью описать мое мнение.

Динамический прокси:
ИМО это пример неправильного использования технологии. Это элементарное поведение WSDL - если оно меняется, вам нужно изменить клиента, или вам нужно сделать правильное WSDL-управление версиями и создать новый клиент.

Вы все еще должны как-то сказать, что ваш клиент получит WSDL - означает ли это, что вы будете разбирать WSDL перед каждым звонком? Не кажется хорошей идеей.

Информация о типах действительно не является частью WSDL, поскольку по умолчанию WSDL генерируется как совместимый. Типы CLR не требуются для взаимодействия. Когда вы создаете прокси-сервер службы путем добавления ссылки службы или Svcutil, он будет генерировать код для типов, определенных в WSDL. Затем этот код необходимо скомпилировать.

Вы можете использовать NetDataContractSerializer вместо DataContractSerializer. NetDataContractSerializer добавляет информацию типа CLR в WSDL, но я все еще ожидаю, что новые типы должны быть известны вашим клиентам - это означает развертывание новой сборки с использованием типов и ее использование клиентами. Это почти похоже на тот же подход, когда просто развертывание сборки с новым статическим клиентским прокси.

Динамические WF клиент
Я также не вижу слишком много использования этой архитектуры - вам все еще нужен изменить клиент, чтобы отразить новые шаги WF, не так ли?

Изменение WF
Мы говорим о фундаменте Windows Workflow? Я не могу себе представить сценарий, в котором вы создаете WF, выставляете его как сервис и затем меняете его. Когда вы открываете WF в качестве сервиса, вы, вероятно, определяете длительный WF. Долгосрочные WF используют стойкость, основанную на сериализации (по крайней мере, в WF 3.5, но я считаю, что она такая же в WF 4).Когда вы изменяете определение WF, все сохраненные WF, скорее всего, обречены, потому что они никогда не будут deserialize. Эта ситуация обычно решается путем параллельного развертывания новой и старой версии, где старая версия используется только для завершения неполных WF. Опять же это новые клиенты.

+0

Спасибо за ваш комментарий, как вы говорите, он не решает мою проблему, но я буду +1, потому что это заставляет задуматься - Я согласен с вашей оценкой WSDL в том, что касается типов. Однако, если WsdlImporter позволит мне посмотреть, какие типы WSDL я мог бы получить, туда, куда я хочу идти. Мне не нужен тип CLR. См. Мой следующий комментарий относительно динамических клиентов. – Neil

+1

Мы говорим о длинных классах WF. Нет причин, по которым добавление шага к моему рабочему процессу потребует перестройки клиента, который не выполняет этот шаг. Кроме того, если вы хотите создать основу для управления взаимодействием ваших клиентов с рабочим процессом и чтобы все клиенты соответствовали стандартным интерфейсам, вам необходимо выполнить все вызовы через более узкий API, чем API, создаваемый WF-сервисом. – Neil

+0

@Neil: В таком случае я, вероятно, пошел бы в другом направлении. Я бы сохранил всю эту сложность на стороне сервера. Это означает, что вы принимаете WF в своем процессе и размещаете веб-сервис с помощью хорошо известного интерфейса, подготовленного для изменений WF. Это идея высокого уровня, но это должно быть возможно, и это будет проще, чем «клиент динамического веб-сервиса». –

1

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

WCF имеет механизм для этого IExtensibleDataContracts см: http://msdn.microsoft.com/en-us/library/ms731083%28v=VS.100%29.aspx

Лучшие практики для управления версиями контрактов могут быть найдены here

+0

+1 Спасибо за ответ - он может быть полезен другим.К сожалению, у нас ограниченный контроль над WCF-сервисом, который генерирует WF, поэтому мы не можем пойти по этому пути. – Neil

Смежные вопросы