3

この問題に遭遇しましたか?この前の質問のコードと非常によく似たコードを実行します。nUnitTest モードで URI に「/?test&format=xml」が含まれている場合、nUnit テストは失敗し、IOException、「トランスポート接続からデータを読み取ることができません: 接続が閉じられています。 ."

ただし、その時点で実行されていた Fiddler トレースは、まさに私が期待した xml を示しています。

ブラウザ経由で送信されたときに送信されるリクエストヘッダーを(ほぼ)正確に再作成しました。

最後に、URI から "/?test&format=xml" を除外すると、そうでなければ期待していた html が得られます。

ソースコード:

    public virtual bool Run()
    {
        var request = CreateRequest();
        var response = GetResponse(request);
        var responseString = ReadResponse(response);
        this.SetResults(responseString);
        return this.IsSuccessful;
    }

    protected internal virtual HttpWebRequest CreateRequest()
    {
        var address = TestConfig.Address;

        var request = (HttpWebRequest)WebRequest.Create(address);

        request.Accept = "*/*";
        request.UseDefaultCredentials = true;
        request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);

        return request;
    }

    protected internal virtual HttpWebResponse GetResponse(HttpWebRequest request)
    {
        var response = (HttpWebResponse) request.GetResponse();

        return response;
    }

    protected internal virtual string ReadResponse(HttpWebResponse response)
    {
        var stream = response.GetResponseStream();
        var responseString = ReadResponse(stream);

        stream.Close();
        response.Close();

        return responseString;
    }

    protected internal virtual string ReadResponse(Stream stream)
    {
        var reader = new StreamReader(stream);
        var responseString = reader.ReadToEnd();
        return responseString;
    }
4

1 に答える 1

0

エラー メッセージ「トランスポート接続からデータを読み取れません: 接続が閉じられています。」Fiddler が html 応答本文を取得しているのを見ているという事実とは実際には関係ありません。

HttpWebResponse の StatusCode を確認し (OK の場合は 200 である必要があります)、要求を try/catch ブロックでラップします ( http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.statuscode(の例) v=vs.80).aspx )

try 
   {    
        // Creates an HttpWebRequest for the specified URL. 
        HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
        // Sends the HttpWebRequest and waits for a response.
        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 
        if (myHttpWebResponse.StatusCode == HttpStatusCode.OK)
           Console.WriteLine("\r\nResponse Status Code is OK and StatusDescription is: {0}",
                                myHttpWebResponse.StatusDescription);
        // Releases the resources of the response.
        myHttpWebResponse.Close(); 

    } 
catch(WebException e) 
   {
        Console.WriteLine("\r\nWebException Raised. The following error occured : {0}",e.Status); 
   }
catch(Exception e)
{
    Console.WriteLine("\nThe following Exception was raised : {0}",e.Message);
}

HttpWebRequest オブジェクトをすばやく作成して破棄している場合、ソケットがシャットダウン中に time_wait 状態になる可能性があり、ソケットが完全に閉じられるまで再度開くことはできません。この場合は、別のポートを使用するか、接続の存続時間を変更することを検討してください。

于 2012-02-23T10:17:24.767 に答える