0

WebRequest からストリームを返すときに問題が発生しました。ストリームが閉じられたと表示されます。同じメソッドにすべてがある場合、ここで動作します。コード例は次のとおりです。

public static Stream MethodOne()
{
            Uri uri = new Uri(url, true);
            WebRequest request = WebRequest.Create(uri);
            request.Method = "GET";

            Stream responseStream = null;
            using (WebResponse webResponse = request.GetResponse())
            {
                responseStream = webResponse.GetResponseStream();
            }
}

他の方法は次のとおりです。

public static XDocument MethodTwo()
        {
            Stream stream = MethodOne();
            if (stream == null)
            {
                return null;
            }

            XmlReader xmlReader = XmlReader.Create(stream);
            return XDocument.Load(xmlReader);
        }

私が得るエラーは、次のメッセージでストリームから xmlReader を作成しようとしたところです:要求は中止されました: 接続は予期せず閉じられました。

それを解決する方法はありますか?

4

2 に答える 2

1

using ステートメントは、ストリームを読み取る前に Response で Dispose を呼び出します。

メソッド 1 から WebResponse を返します。

    public static XDocument MethodTwo()
    {

        WebResponse response = MethodOne();
        if (response == null)
        {
            response null;
        }

        try
        {
            var stream = response.GetResponseStream();
            XmlReader xmlReader = XmlReader.Create(stream);
            return XDocument.Load(xmlReader);
        }
        finally
        {
            response.Dispose();
        }

    }

更新: より良い解決策

    public static XDocument MethodTwo()
    {

        using (var response = MethodOne())
        using (var stream = response.GetResponseStream())
        {
            var stream = response.GetResponseStream();
            XmlReader xmlReader = XmlReader.Create(stream);
            return XDocument.Load(xmlReader);
        }

    }

    public static Stream MethodOne()
    {
        Uri uri = new Uri(url, true);
        WebRequest request = WebRequest.Create(uri);
        request.Method = "GET";
        return request;
    }

これにより、(例外が発生した場合でも) リソースが確実に破棄されます。

于 2012-12-12T08:34:25.567 に答える
0

SchlaWiener が指摘したように、あなたが直面している問題は、ストリームを読み取る前にusingステートメントがストリームを呼び出すことです。Dispose()次のようにコードをリファクタリングする必要があります。

public static Stream GetResponseStream() 
{
    var uri = new Uri(url, true);
    WebRequest request = WebRequest.Create(uri);
    request.Method = WebRequestMethods.Http.Get;
    WebResponse response = request.GetResponse();
    return response.GetResponseStream();
}

public static XDocument GetXDocument()
{
    using(Stream stream = GetResponseStream())
    {
        XmlReader xmlReader = XmlReader.Create(stream);
        return XDocument.Load(xmlReader);
    }
}

このようにして、読み取り後にのみストリームが閉じられるようにします。

于 2012-12-12T09:36:41.187 に答える