Несколько советов по внедрению сервисов в локальной сети. WCF против .Net Remoting - PullRequest
2 голосов
/ 19 мая 2009

Я разрабатываю слой доступа к ресурсам, который будет располагаться на сервере базы данных в локальной сети, состоящей из 5 рабочих станций и 7 серверов. Мое намерение для уровня доступа к ресурсам состоит в том, чтобы предоставить набор четко определенных методов C # любому клиенту C # (.Net 3.5) в локальной сети и позволить клиенту получать доступ к данным, хранящимся в СУБД, не зная, как эти данные доступ к Это в основном упражнение в простой абстракции.

До сих пор я настроил объектный реляционный преобразователь для извлечения данных как объектов из СУБД (MS SQL Server 2008). Затем я написал простой класс доступа к данным, который использует эти объекты для извлечения и вставки данных. Примеры методов включают GetUser (Int ID) и SetUser (Int ID, имя пользователя String, пароль String). Все методы принимают и возвращают нативные типы, а не объекты-сущности или аналогичные оболочки.

Я хочу сделать этот класс удаленно доступным в локальной сети, чтобы любой клиентский код C # мог использовать один и тот же одноэлементный класс для доступа к данным в простом формате. Во времена .Net 2.0 очевидным выбором было бы использование удаленного взаимодействия .Net и объявление класса для наследования MarshalByRefObject. Однако с появлением .Net 3.5 и WCF появилось много других возможностей.

До сих пор я неохотно использовал WCF для уровня доступа к ресурсам. Насколько я понимаю, все данные передаются в виде сообщений SOAP, и это именно то, что вам нужно, если данные будут проходить через Интернет и быть доступными для нескольких платформ, но это может быть слишком сложным для моих нужд. Все платформы в локальной сети - либо Windows Vista, либо Windows Server 2008, на всех установлен .net 3.5. Нет реальной необходимости сериализации данных в формате XML, поскольку все данные являются родными для платформ, которым может потребоваться доступ к ним. Другое беспокойство у меня есть скорость. Этот уровень должен быть максимально быстрым, если данные должны быть перекодированы в XML, будут созданы накладные расходы.

Я ищу любые советы по лучшим технологиям .Net для использования в этой ситуации. Возможно, я упустил из виду существенную выгоду, которую может предложить WCF, или может быть способ настроить WCF для использования самых основных полезных нагрузок. Однако, если мои проблемы хорошо обоснованы, я буду использовать .Net remoting вместо него.

Извините за длинный вопрос, любой совет будет приветствоваться.

Спасибо за ваше время,

Джеймс

Ответы [ 3 ]

2 голосов
/ 19 мая 2009

WCF очень быстрый и для правильно спроектированного использования он часто быстрее, чем удаленное взаимодействие .NET. Первая статья Adinochestva была посвящена производительности сериализации .NET DataSets, что является худшим сценарием.

Чтобы помочь вам решить, какую привязку использовать с WCF для ваших целей, ознакомьтесь с этой статьей в журнале CoDe. Блок-схема вверху очень полезна: http://www.code -magazine.com / article.aspx? Quickid = 0605051 & страница = 3

В конце приводится описание различных привязок и метода сериализации, которые они используют.

При удаленном взаимодействии .NET вы также требуете, чтобы двоичная зависимость разделялась как на клиенте, так и на сервисе, что не является обязательным для WCF. Таким образом, вы получите поддержку версий, которую вы не получите с удаленным доступом. Remoting также является технологией, в которую Microsoft больше не инвестирует ... однако, они вкладывают значительные средства в WCF.

Надеюсь, вы обнаружите, что преимущества WCF перевешивают его ограничения.

0 голосов
/ 19 мая 2009

С WCF вы можете использовать привязку TCP / IP, которая очень быстра, но будет работать только на платформах Windows (что нормально в вашем случае). Он работает так же, как любой веб-сервис, за исключением того, что вместо привязки к http: // он использует net.tcp: //

0 голосов
/ 19 мая 2009

вы можете увидеть сравнение здесь или сравнение, которое Microsoft сделала здесь Но если вы решили использовать wcf, убедитесь, что вы не создаете ChannelFactory для каждого запроса

...