检测WCF服务是否在线第二版

王朝学院·作者佚名  2016-08-28
窄屏简体版  字體: 小  |  中  |  大  |  超大  

上一版在这里http://www.cnblogs.com/kklldog/p/4878296.html

上一版主要是解决了监控服务不需要手动添加服务引用的问题,但是还是需要在配置文件中添加对应的endpoint信息,以及需要真正的contract接口的dll文件来实现反射生成wcf通道。

这样其实还是挺繁琐的,每添加一个监控的服务,都需要修改一堆配置,外加复制一堆dll。新版中已经不需要复制真正的contract的dll文件跟endpoint配置了。

上一版我需要contract的dll一是为了反射去创建wcf调用通道,二是为了调用其中一个真正的方法。其实可以使用一个假的contract接口跟一个假的方法来探测就可以。

因为就算使用假的contract接口通道也是可以建立的,调用一个不存在的方法会报一个System.ServiceModel.ActionNotSupportedException的异常,这表明服务是存在的。

然后我们只需要一个假的contract接口:

[ServiceContract]

public interface IFakeWcfInterface

{

[OperationContract]

string ThisIsATestMethod();

}

然后使用ChanelFactory去构造通道,这次不用反射了,更加简单。为了移除endpoint的配置文件,我们直接手动用代码实例化一个ServiceEndpoint。我这边所有的服务的binding都是统一的,所以可以写死了,如果每个服务的binding等信息都不一样,那么还需要抽象到config文件里了。

测试是否alive:

PRivate bool IsALive(string endpointName,string url)

{

try

{

FuncExtension.TryDo(() =>

{

var endpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(IFakeWcfInterface)), new NetTcpBinding(SecurityMode.None), new EndpointAddress(url));

var channelFactory = new ChannelFactory<IFakeWcfInterface>(endpoint);

var proxy = channelFactory.CreateChannel();

try

{

proxy.ThisIsATestMethod();

}

catch (Exception exc)

{

Logger.Trace(

string.Format("Try to connect wcf service error:{0}, ExceptionType:{1}", endpointName,

exc.GetType()), GetType(), exc);

throw;

}

finally

{

try

{

(proxy as ICommunicationObject).Close();

}

catch

{

(proxy as ICommunicationObject).Abort();

}

}

}, 3);

return true;

}

catch (Exception exc)

{

PrintWholeException(exc);

return !IsHttpOrSocketException(exc);

}

}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航