2

我有一个.ASHX用 C# 编写的独立处理程序(问题是我无法在本地对此进行测试,因为我们的开发环境被防火墙保护得太重,并且不允许我允许传入通知出现异常。

我已经在我们的测试环境中对此进行了测试,并且通知正在被正确接收和处理,但是在随机代码审查之后,看起来我的处理方式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();
 }
4

2 回答 2

2

最好使用using块:

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

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

于 2013-10-09T08:23:44.717 回答
1

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

responseStream.Seek(0, SeekOrigin.Begin);

using (StreamReader sr = new StreamReader(responseStream))
{
    message = sr.ReadToEnd();
}

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

看看CommunicationException 类

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

于 2013-10-09T08:29:27.020 回答