Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用'安全吗;使用';而不是关闭WebResponse和StreamReader 目前_C#_Httpwebrequest_Streamreader - Fatal编程技术网

C# 使用'安全吗;使用';而不是关闭WebResponse和StreamReader 目前

C# 使用'安全吗;使用';而不是关闭WebResponse和StreamReader 目前,c#,httpwebrequest,streamreader,C#,Httpwebrequest,Streamreader,我为HttpWebRequest实现了一个名为GetResponse(url)的简单助手方法。目前,我正在读取结果后手动关闭WebResponse和StreamReader。然后我返回所述结果,如下所示: // construct the request HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; // get the result WebResponse re

我为
HttpWebRequest
实现了一个名为
GetResponse(url)
的简单助手方法。目前,我正在读取结果后手动关闭
WebResponse
StreamReader
。然后我返回所述结果,如下所示:

// construct the request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";

// get the result
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string result = reader.ReadToEnd();

// clean up and return the result
reader.Close();
response.Close();
return result;
提出 使用语句而不是关闭语句将收益包含在
中是否安全;这是否与
.Close()
es具有相同的效果

// construct the request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";

// get the result
using (WebResponse response = request.GetResponse())
{
    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        return reader.ReadToEnd();
    }
}

这不仅是安全的——它比原来的更安全,因为即使抛出异常,它也会处理对象;使用
语句的
相当于
try
/
finally
语句

一般来说,无论何时编写代码>关闭()/<代码>或<代码>处理()/<代码>显式调用,请考虑是否可以使用<<代码>使用语句。 (顺便说一句,请注意,您并没有使用来自web响应的编码-您总是假设使用UTF-8。如果可以的话,使用

WebClient
可以使这更简单。)

StreamReader reader;
try
{
    reader = new StreamReader();
    // code
}
finally
{
    if (reader != null)
    {
        reader.Dispose();
    }
}

因此,它与您的代码几乎相同,但由于try/finally块,因此更安全。

我建议您这样做:

    string ret = string.Empty;
    using (WebResponse response = request.GetResponse())
    {
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            ret = reader.ReadToEnd();
        }
    }
    return ret;

使用“using”是安全的,它将处理WebResponse和StreamReader,但它不保证它将运行返回。

您的意思是
最终
而不是
捕获
。即使没有例外,它也会运行dispose代码;我没有意识到
WebClient
类似乎提供了我一直试图实现的功能。我将把请求稍微向上移动,这样我可以安全地假设响应将是
application/json
。很抱歉,我忘了提及,它将始终是UTF-8。再次感谢。+1表示“一般”,因为我知道在使用WCF客户端时,有一个例外,这会让你怀疑自己,并且必须查看是否使用
使用
。危险。使用语句嵌套可能会导致多次调用dispose,这不能保证是幂等的,并且可能会导致System.ObjectDisposedException。我喜欢嵌套用法的简洁性,但在看到它在dynatrace中引起的ObjectDisposedException噪音后,我注意了我在这里读到的内容@Harryuttle:那么,如果使用
语句的外部
与内部语句之间存在任何差异,你会怎么做?即使忽略异步异常,这也肯定是一个问题。我想我从来没有见过这会导致问题——无论你在哪里看到它会导致问题,我希望你已经和实施
IDisposable
的人谈过,并要求他们修复它。根据MSDN:“一个正确实现的Dispose方法可以多次调用而不引发异常。”这是一个好问题,因为当某些异常需要调用
.Abort()
时,WCF肯定不完全安全。
    string ret = string.Empty;
    using (WebResponse response = request.GetResponse())
    {
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            ret = reader.ReadToEnd();
        }
    }
    return ret;