使用'使用'而不是关闭WebResponse和StreamReader是否安全

时间:2012-10-12 14:16:07

标签: c# httpwebrequest streamreader

目前

我为HttpWebRequest实现了一个名为GetResponse(url)的简单辅助方法。目前,我在阅读结果后手动关闭WebResponseStreamReader。然后我就这样返回结果:

// 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;

安全是否包含using语句中的返回值而不是关闭它们;这会产生与.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();
    }
}

3 个答案:

答案 0 :(得分:23)

这不仅安全 - 它比原始安全更安全,因为即使抛出异常它也会处理掉对象; using语句相当于try / finally语句。

通常,只要您明确编写Close()Dispose()来电,请考虑是否可以使用using语句。

(请注意,顺便说一下,你没有使用网络响应中的编码 - 你总是假设使用UTF-8。如果是选项,使用WebClient可以使这更简单。)< / p>

答案 1 :(得分:1)

using (StreamReader reader = new StreamReader())
{
    // code
}

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

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

答案 2 :(得分:1)

我建议这样做:

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

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

相关问题