[英]Code analysis issue in Visual Studio
請找到以下代碼:
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);
}
}
我之前嘗試過stackoverflow 我是否需要從Request.CreateResponse()處理HttpResponseException? 但它沒有成功。
閱讀本文以了解“Dispose Pattern”。 另外,閱讀這篇文章 ,看看何時應該處置一個對象。 在您的特定情況下,當調用者仍然具有對它的引用時,它看起來像是一個反模式來處理函數的參數。
為了解決您收到的警告, requestMessage.CreateErrorResponse(...)
創建了一個HttpResponseMessage
,它實現了IDisposable
。 在方法返回之前,這超出了范圍(因為沒有對它做出的引用)。 這意味着代碼分析工具會發現永遠不會調用此對象上的Dispose
。
編輯:
要解決此問題,只需刪除using
指令,並按如下方式簡化代碼。
private static void HandleValidationError(ILogger logger, HttpRequestMessage requestMessage, HttpStatusCode statusCode, string message)
{
logger.LogError(LoggingSources.API, message);
throw new HttpResponseException(requestMessage.CreateErrorResponse(statusCode, message));
}
這似乎對我有用。 但是,這會將對象丟棄給調用者。
編輯:
啊哈! 我發現這個堆棧溢出帖子似乎是你的確切問題。 為了完整起見,它基本上表示您不需要處理HttpResponseMessage
對象。 但是,如果您使用構造函數,則已經抑制了此警告,因此您無需自行禁止它。
嘗試這個:
private static void HandleValidationError(ILogger logger, HttpRequestMessage requestMessage, HttpStatusCode statusCode, string message)
{
logger.LogError(LoggingSources.API, message);
throw new HttpResponseException(new HttpResponseMessage(statusCode){
ReasonPhrase = message
});
}
注意:因為我無法重現此問題,所以我無法測試以確保其有效。
經過一些分析后我找到了答案。
private static void HandleValidationError(ILogger logger, HttpRequestMessage requestMessage, HttpStatusCode statusCode, string message)
{
logger.LogError(LoggingSources.API, message);
using (var errorResponse = requestMessage.CreateErrorResponse(statusCode, message))
{
throw new HttpResponseException(errorResponse);
}
}
這將解決CA問題。 我也想感謝約翰的幫助。
使用using
使得500內部服務器錯誤。
我的解決方案是RegisterForDispose
因此它變為:
var errorResponse = requestMessage.CreateErrorResponse(statusCode, message));
this.request.RegisterForDispose(errorResponse);
throw new HttpResponseException(errorResponse);
您仍需要抑制CA2000警告,但我認為這是正確的處理方式,因此CA2000需要允許此配置模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.