Пример разговора с использованием WCF
Обновлен: Ноябрь 2007
В примере разговора демонстрируется реализация приложения для многопользовательского разговора посредством технологии PeerChannel. Сообщения, отправляемые экземпляром приложения разговора, принимаются всеми остальными экземплярами.
Получение примеров и инструкций по их установке
Выполните одно или несколько из следующих действий:
В меню Справка выберите пункт Примеры.
Отобразится информация о примерах, содержащаяся в файле сведений о продукте.
Посетите веб-узел примеров Visual Studio 2008 Здесь содержатся самые последние версии примеров.
Найдите примеры на компьютере, где установлена среда Visual Studio. По умолчанию примеры и файл сведений о продукте устанавливаются в папку диск:\Program Files\Microsoft Visual Studio 9.0\Samples\lcid. Для выпусков Express продукта Visual Studio все примеры располагаются в Интернете.
Дополнительные сведения см. в разделе Поиск файлов примеров.
Примечание о безопасности. |
---|
Этот пример кода иллюстрирует концепцию и содержит только код, относящийся к этой концепции. Он может не отвечать требованиям безопасности для конкретных условий, и его не следует использовать в точности в том виде, в каком он приведен. Чтобы проект был безопасным и надежным, рекомендуется добавить код обеспечения безопасности и код обработки ошибок. Корпорация Майкрософт предоставляет этот пример кода на условиях “как есть”, без каких-либо гарантий. |
Для выполнения примера
В обозревателе решений откройте файл .sln.
Всякий раз, когда действие относится к клиенту или службе, эти действия применяются к отдельным экземплярам примера (поскольку пример разговора не является приложением "клиент-служба").
Нажмите клавишу F5 для запуска приложения разговора.
Запустите столько экземпляров (именованных экземпляров, имеющих следующий путь: Путь установки Visual Basic\Projects\Chat\Instance\Bin\Debug\Instance.exe), сколько требуется. Начните с ввода псевдонима, по которому будут отличаться сообщения, отправленные от конкретного экземпляра клиента. Вскоре после ввода этого имени сообщения разговора могут быть отправлены в сетку. Эти сообщения должны отправляться всем остальным экземплярам с определенным именем участника разговора. (То есть сообщение от клиента, имеющего аналогичное имя, не будет отображаться, а собственное сообщение отдельного клиента не будет отправляться в окно консоли этого клиента.)
Демонстрации
Пример разговора не является приложением "клиент-служба". Оно является действительным одноранговым приложением, в котором каждый экземпляр действует в качестве однорангового узла других экземпляров. Каждый экземпляр может отправлять сообщения другим экземплярам и получать сообщения от других экземпляров посредством дуплексного контракта IChat.
Ключевые понятия
PeerChannel — это многопользовательская, одноранговая (P2P) технология связи в Windows Communication Foundation (WCF). Она позволяет поддерживать безопасный, масштабируемый и надежный обмен сообщениями. Одним из распространенных примеров многопользовательского приложения, которым могут использоваться преимущества технологии PeerChannel, является приложение для совместной работы, такое как разговор. В приложении разговора группа людей общаются друг с другом по одноранговой сети без использования серверов. Технология PeerChannel поддерживает одноранговую совместную работу, распространение содержимого, балансировку нагрузки и распределенную обработку сценариев потребителя и предприятия.
PeerChannel вводит следующие новые понятия:
Сетка — это именованная коллекция (взаимосвязанный граф) из одноранговых узлов, которые могут взаимодействовать между собой, и каждый из которых идентифицируется по уникальному ИД сетки.
Примечание. Активные узлы в сетке публикуют свои имена, чтобы другие узлы могли найти их. Сетка корректируется в соответствии с изменением членства, она имеет адаптируемые возможности подключения в среде, где узлы постоянно добавляются в сетку и удаляются из нее, и она динамически оптимизируется для приспособления к шаблонам трафика.
Активные узлы в сетке публикуют свои имена, чтобы другие узлы могли найти их. Сетка корректируется в соответствии с изменением членства, она имеет адаптируемые возможности подключения в среде, где узлы постоянно добавляются в сетку и удаляются из нее, и она динамически оптимизируется исходя из применяемых шаблонов трафика.
Одноранговый узел — это конечная точка в сетке. Одно приложение может иметь несколько одноранговых узлов, которые участвуют в различных сетках.
Распознаватель узлов отвечает за сопоставление идентификаторов сетки адресам конечных точек, соответствующих узлам в сетке. Одноранговый узел использует эти адреса для подключения к другим узлам в сетке. Это позволяет сообщениям распространяться по всей сетке.
Разговор является приложением 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, а затем клавишу "ВВОД" в каждом окне консоли.
Примечание. |
---|
В настоящее время в примере не обрабатываются все возможные исключения, которые может выдавать инфраструктура. Если эти примеры используются в коммерческой или производственной среде, следуйте соответствующим правилам обработки исключений. |
См. также
Задачи
Пошаговое руководство. Создание служб WCF и доступ к таким службам