Пара вещей, когда вы размещаете службу с обнаружением через IIS
- В конфигурации службы убедитесь, что имя службы соответствует имени класса, включая пространство имен
- .чтобы убедиться, что служба работает, прежде чем вы сможете обнаружить ее с помощью клиента.Вы можете вручную перейти к файлу .svc службы или разместить службу в AppFabric и установить для AutoStart значение true (вы также можете указать это в файле web.config)
- В конфигурации службы вы должны указать тип, который вы используете.Вы собираетесь использовать в критерии поиска на клиенте
Вот пример конфигурации сервера, устанавливающей конечные точки службы.Обратите внимание, что атрибут «имя» службы - это полное пространство имен для класса, реализующего службу.
Конфигурация службы
<services>
<service name="WcfDiscovery.Services.BuzzerService" behaviorConfiguration="sb1" >
<endpoint binding="basicHttpBinding" contract="WcfDiscovery.Contracts.IAlarmServer" address="" behaviorConfiguration="eb1" />
<endpoint kind="udpDiscoveryEndpoint" />
</service>
</services>
Также убедитесь, что вы добавили поведение обнаружения в службу
Настройка службы
<serviceBehaviors>
<behavior name="sb1">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceDiscovery />
</behavior>
</serviceBehaviors>
Поскольку я хочу, чтобы клиенты могли обнаруживать службу по типу (WcfDiscovery.Contracts.IAlarmServer), я также должен указать это в конфигурации поведения для конечной точки(eb1)
Service Config
<endpointBehaviors>
<behavior name="eb1">
<endpointDiscovery enabled="true">
<types>
<add name="WcfDiscovery.Contracts.IAlarmServer" />
</types>
</endpointDiscovery>
</behavior>
</endpointBehaviors>
Теперь на стороне клиента я могу обнаружить службу, используя findCriteria.Обратите внимание, что тип в критериях поиска должен совпадать с типом, выданным службой (в списке типов услуг)
Client Config
<standardEndpoints>
<dynamicEndpoint>
<standardEndpoint name="dynamicEndpointConfiguration">
<discoveryClientSettings >
<endpoint kind="udpDiscoveryEndpoint" />
<findCriteria maxResults="2">
<types>
<add name="WcfDiscovery.Contracts.IAlarmServer" />
</types>
</findCriteria>
</discoveryClientSettings>
</standardEndpoint>
</dynamicEndpoint>
</standardEndpoints>
Вот конфигурация конечной точки клиента
Client Config
<client>
<endpoint kind="dynamicEndpoint" name="endpoint" binding="basicHttpBinding" contract="WcfDiscovery.Contracts.IAlarmServer" endpointConfiguration="dynamicEndpointConfiguration" />
</client>
Наконец, я могу обнаружить службу в консольном приложении, например:
ChannelFactory<IAlarmServer> factory = new ChannelFactory<IAlarmServer>("endpoint");
var proxy = factory.CreateChannel();
Console.WriteLine(proxy.SoundAlarm());
Надеюсь, это поможет!