Нет, в WCF нет механизма, позволяющего определенным клиентам использовать ваш сервис, одновременно запрещая другим. Вам нужно подойти к этому под другим углом.
Один из способов - не публиковать автоматически метаданные из вашего сервиса - например, сделать его почти «невидимым» - и затем распространить необходимую информацию метаданных в форме одного или нескольких WSDL и одного или нескольких файлов XSD тем клиентам, которых вы хотите подключить к своей службе. Если ваши метаданные недоступны, кто-то, просто просматривающий адрес вашей службы, не получит никакой информации о том, что позвонить.
Обмен метаданными контролируется поведением <serviceMetadata>
и наличием конечной точки "mex" в вашем сервисе. Удалите оба, и ваш сервис невидим.
Другим способом было бы запретить любым внешним пользователям доступ к вашему серверу WCF на основе брандмауэров и сетевых правил. WCF не может сделать это, но ваш сетевой администратор может ограничить, какие IP-адреса имеют физический доступ к компьютеру, на котором работает служба WCF.
Марк
UPDATE:
Чтобы отправить метаданные тем пользователям, которые должны иметь возможность звонить в ваш сервис, вы можете сделать одно из двух:
1) Используя svcutil.exe /t:metadata (path+name of your service assembly)
, вы можете извлечь метаданные из вашей сервисной сборки (например, MyServiceLibrary.dll
). Это даст вам один или несколько WSDL и один или несколько XSD-файлов, которые вам необходимо отправить предполагаемым пользователям. Они могут поместить эти файлы где-нибудь на свой жесткий диск, а затем в «Добавить ссылку на службу», вместо ввода URL-адреса для обнаружения службы, они могут ввести имя основного WSDL (который импортирует все остальные файлы), и они получить прокси своего клиента.
Или:
2) Когда служба запущена и работает, вы можете «Добавить новый проект» в свое решение, выбрать библиотеку классов (MyService.Client
), а затем «Добавить ссылку на службу» и ввести URL-адрес своей службы. Это создаст все необходимые файлы и все в вашей новой библиотеке классов. Скомпилируйте эту библиотеку классов и отправьте эту сборку MyService.Client.dll
пользователям, которым вы хотите предоставить доступ к вашему сервису.
В обоих решениях вам не нужно включать обмен метаданными, и кто-то другой не может просто подойти к вашему сервису и получить всю информацию, необходимую для его вызова.