【问题标题】:Correctly handling responseStream and StreamReader closes正确处理 responseStream 和 StreamReader 关闭
【发布时间】:2013-10-09 16:35:33
【问题描述】:

我有一个用 C# 编写的独立处理程序 (.ASHX),它处理带有 XML 有效负载的传入推送通知,然后解析这些 XML 并提取和处理从中获取的任何必要信息。问题是我无法在本地对此进行测试,因为我们的开发环境防火墙防火墙太严密,而且我不允许传入通知出现异常。

我已经在我们的测试环境中对此进行了测试,并且通知正在被正确接收和处理,但是在随机代码审查之后,看起来我处理responseStreamsstreamReaders 的方式可能存在问题。

我的问题是,这是处理这些资源关闭的有效方法还是可能导致NullReferenceException

处理这些资源的标准做法是什么,我应该使用using 语句来保持它们仅用于该范围还是这段代码就足够了?

Stream responseStream = null;
StreamReader reader = null;
string serverResponse = null;

try
{
    responseStream = response.GetResponseStream();
    reader = new StreamReader(responseStream);
    serverResponse = reader.ReadToEnd();
}

finally
{
    if (reader == null)
    {
        reader.Close();
    }

    if (responseStream == null)
    {
        responseStream.Close();
    }

    response.Close();
 }

【问题讨论】:

    标签: c# resources nullreferenceexception streamreader


    【解决方案1】:

    最好使用using 块:

    string serverResponse = null;
    using (Stream responseStream = response.GetResponseStream())
    {
       using (StreamReader reader = new StreamReader(responseStream))
       {
           serverResponse = reader.ReadToEnd();
       }
    }
    

    这样,即使using 语句中出现异常,所有流也会正确关闭。

    【讨论】:

    【解决方案2】:

    除了您的代码之外,我还想使用以下代码:

    responseStream.Seek(0, SeekOrigin.Begin);
    
    using (StreamReader sr = new StreamReader(responseStream))
    {
        message = sr.ReadToEnd();
    }
    

    我会添加一个“catch”,如果您的响应流以某种方式失败怎么办,例如它在另一端提前关闭,协议等不匹配?

    看看the CommunicationException Class

    附:我个人不喜欢嵌套 using 语句,但如果必须使用它们,请查看 AggregateExceptions。

    【讨论】:

    • 太棒了,感谢您的输入,我会看看它们,首先标记为简单使用和实现的答案,但您的答案也很棒,谢谢
    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2010-12-23
    相关资源
    最近更新 更多