Поделиться через


Пример разговора с использованием WCF

Обновлен: Ноябрь 2007

В примере разговора демонстрируется реализация приложения для многопользовательского разговора посредством технологии PeerChannel. Сообщения, отправляемые экземпляром приложения разговора, принимаются всеми остальными экземплярами.

Получение примеров и инструкций по их установке

  • Выполните одно или несколько из следующих действий:

    • В меню Справка выберите пункт Примеры.

      Отобразится информация о примерах, содержащаяся в файле сведений о продукте.

    • Посетите веб-узел примеров Visual Studio 2008 Здесь содержатся самые последние версии примеров.

    • Найдите примеры на компьютере, где установлена среда Visual Studio. По умолчанию примеры и файл сведений о продукте устанавливаются в папку диск:\Program Files\Microsoft Visual Studio 9.0\Samples\lcid. Для выпусков Express продукта Visual Studio все примеры располагаются в Интернете.

Дополнительные сведения см. в разделе Поиск файлов примеров.

Bb690929.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

Этот пример кода иллюстрирует концепцию и содержит только код, относящийся к этой концепции. Он может не отвечать требованиям безопасности для конкретных условий, и его не следует использовать в точности в том виде, в каком он приведен. Чтобы проект был безопасным и надежным, рекомендуется добавить код обеспечения безопасности и код обработки ошибок. Корпорация Майкрософт предоставляет этот пример кода на условиях “как есть”, без каких-либо гарантий.

Для выполнения примера

  1. В обозревателе решений откройте файл .sln.

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

  2. Нажмите клавишу F5 для запуска приложения разговора.

  3. Запустите столько экземпляров (именованных экземпляров, имеющих следующий путь: Путь установки Visual Basic\Projects\Chat\Instance\Bin\Debug\Instance.exe), сколько требуется. Начните с ввода псевдонима, по которому будут отличаться сообщения, отправленные от конкретного экземпляра клиента. Вскоре после ввода этого имени сообщения разговора могут быть отправлены в сетку. Эти сообщения должны отправляться всем остальным экземплярам с определенным именем участника разговора. (То есть сообщение от клиента, имеющего аналогичное имя, не будет отображаться, а собственное сообщение отдельного клиента не будет отправляться в окно консоли этого клиента.)

Демонстрации

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

Ключевые понятия

PeerChannel — это многопользовательская, одноранговая (P2P) технология связи в Windows Communication Foundation (WCF). Она позволяет поддерживать безопасный, масштабируемый и надежный обмен сообщениями. Одним из распространенных примеров многопользовательского приложения, которым могут использоваться преимущества технологии PeerChannel, является приложение для совместной работы, такое как разговор. В приложении разговора группа людей общаются друг с другом по одноранговой сети без использования серверов. Технология PeerChannel поддерживает одноранговую совместную работу, распространение содержимого, балансировку нагрузки и распределенную обработку сценариев потребителя и предприятия.

PeerChannel вводит следующие новые понятия:

  • Сетка — это именованная коллекция (взаимосвязанный граф) из одноранговых узлов, которые могут взаимодействовать между собой, и каждый из которых идентифицируется по уникальному ИД сетки.

    Bb690929.alert_note(ru-ru,VS.90).gifПримечание.

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

  • Активные узлы в сетке публикуют свои имена, чтобы другие узлы могли найти их. Сетка корректируется в соответствии с изменением членства, она имеет адаптируемые возможности подключения в среде, где узлы постоянно добавляются в сетку и удаляются из нее, и она динамически оптимизируется исходя из применяемых шаблонов трафика.

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

  • Распознаватель узлов отвечает за сопоставление идентификаторов сетки адресам конечных точек, соответствующих узлам в сетке. Одноранговый узел использует эти адреса для подключения к другим узлам в сетке. Это позволяет сообщениям распространяться по всей сетке.

Разговор является приложением Windows Forms. Каждый экземпляр приложения разговора создает объект IDuplexChannel, имеющий один и тот же адрес конечной точки. Поскольку все экземпляры приложения разговора используют один и тот же адрес, сообщение, отправляемое одним экземпляром приложения, принимается всеми остальными экземплярами в этом одноранговом канале.

Приложение разговора определяет и реализует дуплексный контракт IChat. Контракт IChat разрешен только для односторонних операций, поскольку ServiceModel не поддерживает парадигму "один запрос/нескольких ответов". (В многопользовательском канале на один запрос, который отправляется в сетку, можно создать несколько ответов.)

В этом примере реализуется статическая функция Main для создания объекта IClientChannel с дуплексным контрактом IChat. Функцией используется конечная точка, которая указана в файле конфигурации.

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

Экземпляры разговора в этом примере находят друг друга либо с помощью распознавателя, заданного пользователем, либо с помощью распознавателя одноранговых узлов, установленного по умолчанию (PNRP). Обратите внимание, что протокол PRNP недоступен в Windows Server 2003. Поэтому для запуска этого примера на компьютере, работающим под управлением Windows Server 2003, должен использоваться распознаватель, заданный пользователем. По умолчанию в этом примере используется пользовательский распознаватель. Тип распознавателя (пользовательский или установленный по умолчанию) определяется конечной точкой разговора, указанной в следующем файле конфигурации. Чтобы переключиться на установленный по умолчанию распознаватель одноранговых узлов (PNRP), используйте вместо параметра BindingCustomResolver параметр BindingDefault для элемента bindingConfiguration в файле конфигурации примера.

<!-- Chat instance participating in the mesh. -->
         <endpoint name="ChatEndpoint"
                   address="net.p2p://chatMesh/ServiceModelSamples/Chat" 
                   binding="netPeerTcpBinding" 
                   bindingConfiguration="BindingCustomResolver" 
                   contract="Microsoft.ServiceModel.Samples.IChat">
         </endpoint>

Чтобы разрешить взаимодействие однорангового узла со службой Peer Channel Custom Peer Resolver, необходимо определить конфигурацию клиента службы Peer Channel Custom Peer Resolver в файле конфигурации.

<!-- Client used to communicate with the custom resolver service. -->
<client>
<endpoint configurationName="CustomPeerResolverEndpoint"
address="net.tcp://localhost/ServiceModelsamples/peerResolverService"
    binding="netTcpBinding"
    bindingConfiguration="Binding3"
    contract="Microsoft.ServiceModel.SamplesICustomPeerResolver">
</endpoint>
</client>

Адрес идентифицирует адрес службы распознавателя. Если служба распознавателя выполняется на удаленном компьютере, замените параметр localhost именем домена.

В примере также демонстрируется порядок извлечения однорангового узла от объекта IClientChannel и порядок регистрации событий в режиме подключения к сети и в автономном режиме с помощью элемента IOnlineStatus. Событие в режиме подключения к сети инициируется при подключении однорангового узла, по крайней мере, к одному узлу в сетке. Событие в автономном режиме инициируется, когда одноранговый узел уже не подключен ни к одному из узлов сетки.

В настоящее время метаданные не могут быть созданы, поскольку одноранговый канал не интегрирован с программой обслуживания метаданных (Svcutil.exe).

При запуске примера сообщения, отправленные экземпляром разговора, отображаются в окнах консоли других экземпляров разговора. Чтобы закрыть экземпляр, нажмите клавишу Q, а затем клавишу "ВВОД" в каждом окне консоли.

Bb690929.alert_note(ru-ru,VS.90).gifПримечание.

В настоящее время в примере не обрабатываются все возможные исключения, которые может выдавать инфраструктура. Если эти примеры используются в коммерческой или производственной среде, следуйте соответствующим правилам обработки исключений.

См. также

Задачи

Пошаговое руководство. Создание служб WCF и доступ к таким службам

Пример использования служб ASMX и WCF