有没有办法检查App.config <system.servicemodel>部分中定义的服务的可用性?</system.servicemodel>

时间:2011-07-06 14:57:53

标签: .net wcf monitoring

我有一个大型项目,它消耗了大量的WCF服务。端点在我的App.config文件的<system.serviceModel>部分中定义。

我们可以通过以下方式枚举这些端点:
ClientSection clientSection = ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection;

有没有办法以某种方式“ping”每个端点,以确保它背后的服务是活着的(或不是)?我不想明确地为每个服务实现Ping()方法并调用它来检查服务可用性(实际上,我不能这样做,因为我的项目使用的一些WCF服务是第三方服务)。我只是想确保App.config中的每个端点都可以工作(或不工作),而无需通过服务代理调用任何服务方法。

2 个答案:

答案 0 :(得分:1)

如果不实现特定的'Monitor'接口,我能想到的最简单的方法是使用端点地址执行带WebRequest(假设为http WCF)或Ping(假设tcp WCF)的标准GET。

如果使用http,这至少会确认该服务是可访问的,但不是很多。

如果使用tcp,ping将仅确认主机可用。

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

答案 1 :(得分:1)

您可以通过修改配置文件将发现端点添加到服务中。然后,您将能够查询本地网络(通过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的唯一问题是它可能有点慢。您可以通过从专用发现服务器提供有关服务的信息来提高速度。