Есть ли способ проверить доступность сервисов, определенных в App.configраздел? - PullRequest
2 голосов
/ 06 июля 2011

У меня большой проект, который потребляет много услуг WCF.Конечные точки определены в разделе <system.serviceModel> моего файла App.config.

Мы можем перечислить эти конечные точки следующим образом:ClientSection clientSection = ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection;

Есть ли способ как-то «пинговать» каждую из этих конечных точек, чтобы убедиться, что служба, стоящая за ней, жива (или нет)?Я не хочу явно реализовывать метод Ping() для каждой службы и вызывать его для проверки доступности службы (на самом деле я не могу этого сделать, потому что некоторые службы WCF, используемые в моем проекте, являются сторонними службами).Я просто хочу убедиться, что каждая конечная точка в App.config работает (или нет), не вызывая какие-либо методы службы через прокси службы.

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Вы можете добавить конечную точку обнаружения к своей службе, изменив файл конфигурации. После этого вы сможете выполнить запрос в локальной сети (через 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 заключается в том, что он может быть немного медленным. Вы можете повысить скорость, предоставляя информацию об услугах с выделенного сервера обнаружения.

1 голос
/ 06 июля 2011

Без реализации конкретного интерфейса «Монитор» самый простой способ, о котором я могу подумать, - это выполнить стандартный GET с WebRequest (при условии http WCF) или Ping (при условии tcp WCF) с использованием адреса конечной точки.

При использовании http это по крайней мере подтвердит, что служба доступна, но не намного.

При использовании tcp ping только подтвердит, что хост доступен.

Пример пинга;http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx

Пример WebRequest;http://msdn.microsoft.com/en-us/library/system.net.webrequest(v=vs.71).aspx

...