我有一个大型项目,它消耗了大量的WCF服务。端点在我的App.config文件的<system.serviceModel>
部分中定义。
我们可以通过以下方式枚举这些端点:
ClientSection clientSection = ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection;
有没有办法以某种方式“ping”每个端点,以确保它背后的服务是活着的(或不是)?我不想明确地为每个服务实现Ping()
方法并调用它来检查服务可用性(实际上,我不能这样做,因为我的项目使用的一些WCF服务是第三方服务)。我只是想确保App.config中的每个端点都可以工作(或不工作),而无需通过服务代理调用任何服务方法。
答案 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的唯一问题是它可能有点慢。您可以通过从专用发现服务器提供有关服务的信息来提高速度。