从同一个mvc应用程序调用web api端点是超时的

时间:2013-04-18 12:43:47

标签: asp.net-mvc iis asp.net-web-api

我使用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端点没有问题。

此时我完全无能为力。任何帮助将非常感激。

1 个答案:

答案 0 :(得分:0)

首先,来自同一领域的“健康检查”非常无关紧要;并且以这种方式检查延迟尤其微不足道。了解您遇到问题并寻找跟踪此问题的方法,使用跟踪日志或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);
}