当前生产环境有两台服务器做主备服务器并部署WEBService,目前打算再增加一台当成代理服务器,所有调用端均通过代理服务器的WEBService来调用,代理服务器负责确定主服务器是否可用,若可用将接口调用转发到主服务器上,否则将接口调用转发到备用服务器上,从而实现主备切换,目前需要在代理服务器的WEBService中实现检察主备的WEBService 接口是否可用的功能(检测速度要快),目前苦无头绪,请问大家有什么好的解决办法吗?
如果不用组件,可以用下列方法:
public bool IsWebServiceAvaiable(String url)
{
try
{
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
using(HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse())
{
return true;
}
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError)
{
XXX.LogMessage(String.Format("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode));
XXXX.LogMessage(String.Format("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription));
}
}
catch (Exception e)
{
XXX.LogMessage(e.Message);
}
return false;
}
能调用到具体接口吗?比方说我有个HelloWorld的接口
@blackrecord: 不需要,只要你正常的url地址就行。不用具体到方法。
http://.../TestService.asmx
代理服务器上定时检查主服务器是否可用,检查的方法可以简单地查看是否能访问,如下示例代码
///<summary>
/// 判断webservice是否可用
///</summary>
///<returns> true:可用;false:不可用 </returns>
public bool getWSStatus()
{
string url = "http://.../service1.asmx ";
XMLHTTP http = new XMLHTTP();
try
{
http.open( "GET ", url, false, null, null);
http.send(null);
int iStatus = http.status;
//如果取得的网页状态不正确, 就是出问题了
if(iStatus == 200)
return true;
}
catch
{
}
return false;
}
XMLHTTP 的命名空间?
@blackrecord: 引入com组件: microsoft.xml ,版本多少应该没关系吧,我引用的是3.0,然后在代码中using MSXML2;
这种方法不错
@LCM:
这种可以检测到具体的接口吗?,可能WebService地址能访问,但具体的接口调用异常
@blackrecord: 那你每个接口定时调用一下,看能不能访问了。
在.net中验证WebService的Url有效并且验证服务可用:
需要用到win32下的组件,比如Microsoft XML, v5.0
测试程序具体如下:建一个项目,在你的引用中添加COM---找到Microsoft XML, v5.0
然后using MSXML2;
该组件提供一个接口MSXML2.XMLHTTP可以调用
XMLHTTP http = new XMLHTTP();//实例化
http.open( "GET ", url, false, null, null);
http.send(null);//打开url,向该url发送一个请求
http.status记下请求的结果状态
200表示请求成功,即该服务存在,返回其他数值在相应的服务器端有定义错误说明
你可以在你的webservice中写入一个方法来判断你的webservice是否好用,就是简单点返回一个值,
然后你可以通过一个方式去访问这个webservice 的那个检测的方法,看看是不是返回你想要的值,如果是,就代表可用,如果不是,就代表不可以用,你可以写个后台的服务,定时的去访问,去记录,然后,你的程序去访问是,先去访问测试服务的结果。就行了啊。
你直接去调用你所谓的接口(比如:HellowWorld),能行不就是可以用么
对于这种地址检测不了 http://1.1.1.1/aaa/ccc/