簡體   English   中英

Visual Studio中的代碼分析問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM