如何检查 Web 服务中的方法是否正常工作?我无法使用 ping。我仍然想检查客户端从 Web 服务调用的任何类型的方法。我知道很难一概而论,但应该有一些方法。
8 回答
我使用这种方法并且效果很好:
public bool IsAddressAvailable(string address)
{
try
{
System.Net.WebClient client = new WebClient();
client.DownloadData(address);
return true;
}
catch
{
return false;
}
}
了解 Web 服务方法是否“正常”工作的唯一方法是调用该方法,然后评估结果是否“正常”。如果您想记录“罚款”与时间的关系,那么您可以记录评估的结果。
没有更通用的方法可以做到这一点。考虑:
- 您可以拥有创建到服务端点的 HTTP 连接的代码,但成功并不能告诉您服务是否会在您向其发送任何消息后立即抛出异常。
- 您可以连接并向其发送无效消息,但这并不能告诉您太多。
- 您可以连接并发送一条有效消息,然后检查结果以确保它有效。这会给你一个很好的想法,即当真正的客户随后立即调用服务时,真正的客户应该期待一个有效的结果。
- 除非该服务以此为契机崩溃,否则只是为了惹恼你!
最好的技术是使用 WCF 跟踪(可能使用消息级跟踪)来记录服务实际发生的情况,无论好坏。然后,人类可以查看日志以查看它们是否“正常”。
迄今为止,Powershell 是一种“ping”Web 服务端点的简单方法。
使用以下表达式:
Test-NetConnection -Port 4408 -ComputerName 192.168.134.1
这是对不存在或未侦听的端口的故障响应;
WARNING: TCP connect to 192.168.134.1:4408 failed
ComputerName : 192.168.134.1
RemoteAddress : 192.168.134.1
RemotePort : 4408
InterfaceAlias : Ethernet0
SourceAddress : 192.168.134.1
PingSucceeded : True
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded : False
如果地址/端口正在侦听并且可访问,则这是成功的结果:
ComputerName : 192.168.134.1
RemoteAddress : 192.168.134.1
RemotePort : 4407
InterfaceAlias : Ethernet0
SourceAddress : 192.168.134.1
TcpTestSucceeded : True
你可以试试curl
。它是一个 Linux 工具,Cygwin 中也应该有。
$ curl http://google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
有很多选择;例子可以在'net.
只需在 web 服务的方法中使用 try catch 并将异常记录到日志文件或事件日志中。例子:
[OperationContract]
public bool isGUID(string input)
{
bool functionReturnValue = false;
try
{
Guid guid;
functionReturnValue = Guid.TryParse(input, guid);
}
catch (Exception ex)
{
Log.WriteServerErrorLog(ex);
}
return functionReturnValue;
}
您不需要 ping web 服务,而是使用看门狗服务或其他东西 ping 服务器。无需“ping”网络服务。我也认为你不需要这样做。您的网络服务可以正常工作,或者由于代码错误而无法正常工作。
您可以为自己编写一个小工具或 Windows 服务或任何您需要的东西,然后查看以下 2 篇文章:
C#:如何以编程方式检查 Web 服务是否已启动并正在运行?
编辑:这是我在类似场景中的实现,我需要知道每次调用之前是否仍然存在外部服务:
bool IsExternalServiceRunning
{
get
{
bool isRunning = false;
try
{
var endpoint = new ServiceClient();
var serviceUri = endpoint.Endpoint.Address.Uri;
var request = (HttpWebRequest)WebRequest.Create(serviceUri);
request.Timeout = 1000000;
var response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
isRunning = true;
}
#region
catch (Exception ex)
{
// Handle error
}
#endregion
return isRunning;
}
}