c# - 代码分析提示对象可以被处置不止一次。为什么?

标签 c# .net code-analysis

我在以下函数中收到关于 responseStream 的警告:

private static string GetResponseString(WebResponse response)
        {
            using (var responseStream = response.GetResponseStream())
            {
                if (responseStream != null)
                {
                    using (var responseReader = new StreamReader(responseStream))
                    {
                        var strResponse = responseReader.ReadToEnd();
                        return strResponse;
                    }
                }
            }

            return string.Empty;
        }

我从像这样的地方调用这个函数:

var request = (HttpWebRequest)WebRequest.Create(Uri);
            request.Headers.Add("Authorization", "GoogleLogin auth=" + this.SecurityToken);
            request.ContentType = "application/x-www-form-urlencoded";
            request.Method = "POST";
            request.Timeout = 5000;

            // build the post string     
            var postString = new StringBuilder();
            postString.AppendFormat("registration_id={0}", recipientId);
            postString.AppendFormat("&data.payload={0}", message);
            postString.AppendFormat("&collapse_key={0}", collapseKey);

            // write the post-string as a byte array     
            var requestData = Encoding.ASCII.GetBytes(postString.ToString());
            request.ContentLength = requestData.Length;
            var requestStream = request.GetRequestStream();
            requestStream.Write(requestData, 0, requestData.Length);
            requestStream.Close();

            // Do the actual request and read the response stream  
            try
            {
                var response = request.GetResponse();
                var responseString = GetResponseString(response);
                response.Close();

                return responseString.Contains("id=") 
                    ? SendStatus.Ok 
                    : GetSendStatusFromResponse(responseString);
            }
            catch (WebException ex)
            {
                var webResponse = (HttpWebResponse)ex.Response;
                if (webResponse != null)
                {
                    if (webResponse.StatusCode.Equals(HttpStatusCode.Unauthorized))
                    {
                        return SendStatus.Unauthorized;
                    }

                    if (webResponse.StatusCode.Equals(HttpStatusCode.ServiceUnavailable))
                    {
                        return SendStatus.ServiceUnavailable;
                    }
                }

                this.LoggerService.Log(null, ex);
                return SendStatus.GeneralException;
            }

最佳答案

StreamReader 获取在构造函数调用中传递给它的流的所有权,因为它会在 StreamReader 本身关闭时对其调用 Dispose - 因此当外部 Using 语句尝试处置它时它已经被处置。

关于c# - 代码分析提示对象可以被处置不止一次。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10885252/

相关文章:

c# - 查找 "Dead code"

c# - 删除列表中重复项的最佳性能和解决方案

c# - Windows 8 Metro 应用程序文件共享访问

c# - 使用剪切或复制从剪贴板粘贴文件

.net - 将 .NET 代码编译为一个 EXE,将其他命名空间编译为 DLL

c++ - 遗留 C/C++ 代码分析工具

c# - Sonar 异常 : Unknown metric: temp-method-lines

c# - ASP.NET MVC : return JObject as JsonResult

c# - TreeNode 中的自动换行

c# - C#读取文件,方法差异