Вы можете добавить конечную точку обнаружения к своей службе, изменив файл конфигурации. После этого вы сможете выполнить запрос в локальной сети (через UDP Ad-hoc discovery ), чтобы найти (или подтвердить существование) службы, которые предоставляют конкретный контракт на обслуживание, который вы ищете.
Файл конфигурации службы будет выглядеть примерно так:
<system.serviceModel>
<services>
<service name="MyServiceLibrary.Service1">
<host>
<baseAddresses>
<!--Use * instead of localhost, so that the URI returned by discovery will display the machine name correctly-->
<add baseAddress = "net.tcp://*:8887/Design_Time_Addresses/MyServiceLibrary/Service1/" />
<add baseAddress = "http://localhost:8732/Design_Time_Addresses/MyServiceLibrary/Service1/" />
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" contract="MyServiceLibrary.IService1">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<!--This is the endpoint used in service discovery-->
<endpoint name ="udpDiscovery" kind ="udpDiscoveryEndpoint" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
<!--This denotes that the service should allow the discovery behavior-->
<serviceDiscovery />
</behavior>
</serviceBehaviors>
</behaviors>
И код на клиенте будет выглядеть так:
DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
FindResponse response = discoveryClient.Find(new FindCriteria(typeof(ServiceReference1.IService1)));
if (response.Endpoints.Count > 0)
{
foreach (EndpointDiscoveryMetadata metaData in response.Endpoints)
{
// Add whatever logic you want to use to find the expected endpoint
}
}
Преимущество заключается в том, что вы можете добавить критерии поиска, чтобы конкретно описать услугу, которую вы хотите найти. Единственная проблема с ad-hoc UDP заключается в том, что он может быть немного медленным. Вы можете повысить скорость, предоставляя информацию об услугах с выделенного сервера обнаружения.