2

XML ペイロードを運ぶ受信プッシュ通知を処理する C# で記述されたスタンドアロン ハンドラー ( .ASHX) があります。次に、これらの XML を解析し、それらから取得した必要な情報を抽出して処理します。問題は、開発環境のファイアウォールが厳しすぎて、着信通知の例外を許可できないため、これをローカルでテストできないことです。

テスト環境でこれをテストしたところ、通知は正しく受信され、処理されていますが、ランダムなコード レビューの後、私の処理方法に問題があるように見えresponseStreamsますstreamReaders

私の質問は、これはこれらのリソースの閉鎖を処理する有効な方法ですか、それとも潜在的に問題を引き起こす可能性があり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();
}

そして、「キャッチ」を入れます。応答ストリームが何らかの形で失敗した場合、たとえば、反対側で早期に閉じられた場合、プロトコルに不一致がある場合などはどうなりますか?

CommunicationException クラスを見てください。

PS個人的には、ネストされたusingステートメントは好きではありませんが、それらを使用する必要がある場合は、AggregateExceptionsを調べてください。

于 2013-10-09T08:29:27.020 に答える