DelegatingHandler是否有任何性能副作用?

时间:2015-04-16 09:10:15

标签: c# performance async-await asp.net-web-api2 delegatinghandler

我的api项目中有这个委托处理程序:

class MyHandler : DelegatingHandler {
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, 
        CancellationToken cancellationToken) {
        var info = GrabSomeParametersFromHeader();
        var isValid = await Validate(info); // this is a very light database query
        if (!isValid) {
            Log(request, info, false);
            var response = new HttpResponseMessage(HttpStatusCode.Forbidden);
            return response;
        }
        HttpContext.Current.SetMobileRequestInfo(info);
        var result = await base.SendAsync(request, cancellationToken);
        Log(request, info, result.IsSuccessStatusCode && 
        result.StatusCode == HttpStatusCode.OK);
        return result;
    }
}

HttpContext.Current.SetMobileRequestInfo只需将info对象添加到http项,以便稍后在应用中使用。

Validate是一个非常轻量级的数据库查询。 Log方法将请求的数据(例如URI和查询字符串等)插入数据库。

有时候,我会对应用程序产生一种奇怪的行为:它只会下降!没有日志,没有错误,没有。只是服务器不响应请求。我必须重新启动应用程序(例如,通过在web.config中进行虚假更改)才能恢复工作。该应用程序是一个非常简单的应用程我在.NET 4.5平台上使用ASP.NET Web API 2,它运行在IIS 7.5计算机上。我能想到的唯一地方是提到的委托处理程序,它可能导致错误。你有什么主意吗?委派处理程序是否有任何可能导致应用程序关闭的性能副作用?

1 个答案:

答案 0 :(得分:0)

对你的问题的(非常)简短回答是否定的。 DelegatingHandler本身并没有什么固有的东西会导致你的应用程序陷入停顿。问题更可能是你在内部的问题。可能是数据库调用,可能是日志记录。我建议使用分析工具来确定事情的起因。