1

我有一个使用 ASP.NET Web API 实现的 REST 服务。由于某些原因,我需要从同一应用程序中调用其中一个端点并报告从端点获得响应所花费的时间。为此添加了一个普通的 MVC 控制器,其操作如下

public class HealthMonitoringController : Controller
{
    //
    // GET: /HealthMonitoring/

    public ContentResult GetResponseTime(string id)
    {
        var startDateTime = DateTime.Now;
        var httpWebRequest = (HttpWebRequest) WebRequest.Create(<<REST endpoint>>);
        httpWebRequest.Method = WebRequestMethods.Http.Get;
        httpWebRequest.Accept = "application/json;charset=utf-8";
        httpWebRequest.Headers.Add("Accept-Language", "en-GB");
        httpWebRequest.GetResponse();
        var duration = (int) DateTime.Now.Subtract(startDateTime).TotalMilliseconds;
        return Content(String.Format("response time:{0}", duration.ToString(CultureInfo.InvariantCulture)));
    }
}

正如您在上面看到的,我正在使用一个HttpWebRequest类来调用托管在同一网站中的 REST 端点。我记录了请求前后的时间并返回该时间。

问题

我们有一个监控工具,它调用这条路线来获取记录的响应时间。监控工具每 1 分钟调用一次该路由。这通常会工作一段时间,然后httpWebRequest.GetResponse()无明显原因开始超时。事件日志和 IIS 日志中没有任何内容

如果我重新启动应用程序池,这个东西会再次开始工作一段时间,然后在一段时间后停止。

虽然上述事情不起作用,但如果我让 REST 端点手动调用自己,它就会起作用。所以 REST 端点没有问题。

在这一点上我完全一无所知。任何帮助将非常感激。

4

1 回答 1

1

首先,来自同一个域的“健康检查”是无关紧要的;并且以这种方式检查延迟尤其简单。了解您有问题并寻找跟踪此问题的方法,使用跟踪日志或 elmah,而不是重复 ping 到端点。

话虽如此,如果您想检查 API 是否正常工作,您可以实例化控制器并直接调用该方法。这将测试访问部分,而不会将问题与潜在的套接字问题(WebRequest/ WebClient/* 库)分层。正如我所提到的,尽管您并没有真正陷入延迟,但无论如何延迟在这种情况下都是无用的。

var api = new ApiController();
try {
  api.SomeMethod("param1", "param2");
  return Content("works");
} catch (Exception ex) {
  return Content("failed: " + ex.Message);
}
于 2013-04-18T12:57:43.670 回答