正确处理 responseStream 和 StreamReader 关闭

本文关键字:关闭 StreamReader responseStream 正确处理 | 更新日期: 2023-09-27 18:34:28

我有一个用 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();
 }

正确处理 responseStream 和 StreamReader 关闭

最好使用using块:

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

这样,即使语句中存在异常using所有流也将正确关闭。

除了

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

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

我会放一个"陷阱",如果你的响应流以某种方式失败,例如它在另一端提前关闭,协议不匹配等怎么办?

查看 CommunicationException 类

附言我个人不喜欢嵌套使用语句,尽管如果您必须使用它们,请查看 AggregateExceptions。