【发布时间】:2015-09-20 01:48:47
【问题描述】:
请找到以下代码:
private static void HandleValidationError(ILogger logger, HttpRequestMessage requestMessage, HttpStatusCode statusCode, string message)
{
logger.LogError(LoggingSources.API, message);
throw new HttpResponseException(requestMessage.CreateErrorResponse(statusCode, message));
}
}
我收到以下 CA 问题:
CA2000 在方法中丢失范围之前处理对象 'ControllerHelper.HandleValidationError(ILogger, HttpRequestMessage, HttpStatusCode, string)', 对象 'HttpRequestMessageExtensions.CreateErrorResponse(requestMessage, statusCode, message)' 不会沿所有异常路径进行处理。称呼 System.IDisposable.Dispose 对象 'HttpRequestMessageExtensions.CreateErrorResponse(requestMessage, statusCode, message)' 在所有对它的引用都超出之前 范围。 Tasks.Application.Web.API ControllerHelper.cs 106
上述函数的调用者是:
public static void CheckForValidDelimitedIntegerInput(ILogger logger, HttpRequestMessage request, char delimiter, string input)
{
if (!string.IsNullOrEmpty(input))
{
try
{
string[] idList = input.Split(delimiter);
for (int i = 0; i < idList.Length; i++)
{
int result;
if (!int.TryParse(idList[i], out result) || result <= 0)
{
HandleValidationError(logger, request, HttpStatusCode.BadRequest, InvalidIntegerOrShort);
}
}
}
catch (HttpResponseException)
{
throw;
}
}
else
{
HandleValidationError(logger, request, HttpStatusCode.BadRequest, InvalidParameter);
}
}
我在Do I need to dispose an HttpResponseException from Request.CreateResponse()? 之前的帖子中尝试过*,但没有成功。
【问题讨论】:
-
您不需要在
finally块中调用Dispose。它被包裹在using中,它会被处理掉。 -
是的,我知道。但我仍然遇到同样的 CA 问题。
-
您确定要在方法中处理
requestMessage吗?它正在传入;调用方法不应该处理生命周期吗? -
您正在处理传递给方法的
HttpRequestMessage,但您没有处理通过调用requestMessage.CreateErrorResponse创建的HttpRequestMessage。 -
也许把
logger.LogError(LoggingSources.API, message);放在try块里面。
标签: c# .net httprequest code-analysis