2008-09-26 13 views
21

GetResponseStream से HTTP प्रतिक्रिया पढ़ने का सबसे अच्छा तरीका क्या है?GetResponseStream() को पढ़ने का सबसे अच्छा तरीका क्या है?

वर्तमान में मैं निम्नलिखित दृष्टिकोण का उपयोग कर रहा हूं।

Using SReader As StreamReader = New StreamReader(HttpRes.GetResponseStream) 
    SourceCode = SReader.ReadToEnd() 
End Using 

मैं काफी यकीन है कि अगर यह एक http प्रतिक्रिया पढ़ने के लिए सबसे कारगर तरीका है नहीं कर रहा हूँ।

मुझे स्ट्रिंग के रूप में आउटपुट की आवश्यकता है, मैंने एक अलग दृष्टिकोण के साथ article देखा है, लेकिन अगर यह अच्छा है तो मैं काफी नहीं हूं। और मेरे परीक्षणों में कोड के पास विभिन्न वेबसाइटों में कुछ एन्कोडिंग समस्याएं थीं।

आप वेब प्रतिक्रिया कैसे पढ़ते हैं?

+3

आपका रास्ता मेरे लिए ठीक लगता है

हालांकि, जब GetResponseStream() का उपयोग कर प्रतिक्रिया पढ़ना, त्रुटि मिली। मैं इसके साथ कुछ भी गलत नहीं है। – leppie

+0

सूचना में बीटीडब्ल्यू कोड एक के रूप में छोटी है। पढ़ें() का मतलब यह नहीं है कि आपने सभी प्रतिक्रियाएं पढ़ी हैं, इसलिए यह असफल हो जाएगी। –

+0

मेरी इच्छा है कि मैं इसका उत्तर जानूं। मैं एंड्रॉइड पर यह अधिकार प्राप्त करने की कोशिश कर रहा हूं क्योंकि मेरा कार्यान्वयन बेहद धीमा है। एंड्रॉइड पर, आपको ReadToEnd() भी नहीं मिलता है। –

उत्तर

15

मैं कुछ इस तरह किसी URL से एक फाइल डाउनलोड करने के लिए उपयोग करें:

if (!Directory.Exists(localFolder)) 
{ 
    Directory.CreateDirectory(localFolder); 
} 


try 
{ 
    HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(Path.Combine(uri, filename)); 
    httpRequest.Method = "GET"; 

    // if the URI doesn't exist, an exception will be thrown here... 
    using (HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse()) 
    { 
     using (Stream responseStream = httpResponse.GetResponseStream()) 
     { 
      using (FileStream localFileStream = 
       new FileStream(Path.Combine(localFolder, filename), FileMode.Create)) 
      { 
       var buffer = new byte[4096]; 
       long totalBytesRead = 0; 
       int bytesRead; 

       while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        totalBytesRead += bytesRead; 
        localFileStream.Write(buffer, 0, bytesRead); 
       } 
      } 
     } 
    } 
} 
catch (Exception ex) 
{ 
    // You might want to handle some specific errors : Just pass on up for now... 
    // Remove this catch if you don't want to handle errors here. 
    throw; 
} 
3

आप को परिभाषित "बफ़र" और "totalBytesRead" भूल गया:

using (FileStream localFileStream = .... 
{ 
    byte[] buffer = new byte[ 255 ]; 
    int bytesRead; 
    double totalBytesRead = 0; 

    while ((bytesRead = .... 
13

शायद तुम WebClient पर गौर कर सकता है कक्षा। यहां एक उदाहरण दिया गया है:

using System.Net; 

namespace WebClientExample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var remoteUri = "http://www.contoso.com/library/homepage/images/"; 
      var fileName = "ms-banner.gif"; 
      WebClient myWebClient = new WebClient(); 
      myWebClient.DownloadFile(remoteUri + fileName, fileName); 
     } 
    } 
} 
11

स्ट्रिंग में इसे करने का मेरा सरल तरीका। StreamReader कन्स्ट्रक्टर पर true दूसरा पैरामीटर नोट करें। यह बाइट ऑर्डर अंकों से एन्कोडिंग का पता लगाने के लिए कहता है और आप जो एन्कोडिंग समस्या भी प्राप्त कर रहे हैं उसके साथ मदद कर सकते हैं।

string target = string.Empty; 
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=583"); 

HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse(); 
try 
{ 
    StreamReader streamReader = new StreamReader(response.GetResponseStream(),true);     
    try 
    { 
    target = streamReader.ReadToEnd(); 
    } 
    finally 
    { 
    streamReader.Close(); 
    } 
} 
finally 
{ 
    response.Close(); 
} 
+0

बाइनरी डेटा (चित्रों की तरह) को स्थानांतरित करने के लिए, क्या यह StreamReader/स्ट्रिंग का उपयोग करने के लिए अक्षम होगा और बाद में बाइट सरणी में परिवर्तित होगा? स्ट्रीम (बनाम StreamReader) से पढ़ते समय बफर आकार बदलने से निपटने से बचना चाहते हैं? छोटे ट्रांसफर (<1 एमबी) के लिए भी यह खराब कोडिंग अभ्यास होगा। द्विआधारी डेटा के लिए सबसे अच्छा प्रतिक्रिया एन्कोडिंग क्या होगा (ASCII एक बाइट सरणी में परिवर्तित करने के लिए सबसे अधिक कुशल होगा, बनाम यूटीएफ -8 कहें)? धन्यवाद। – samosaris

+0

** उत्तर: ** http: // stackoverflow।कॉम/प्रश्न/5867227/कन्वर्ट-स्ट्रीमreader-to-byte – samosaris

6

PowerShell में, मैं इस समारोह है:

function GetWebPage 
{param ($Url, $Outfile) 
    $request = [System.Net.HttpWebRequest]::Create($SearchBoxBuilderURL) 
    $request.AuthenticationLevel = "None" 
    $request.TimeOut = 600000  #10 mins 
    $response = $request.GetResponse() #Appending "|Out-Host" anulls the variable 
    Write-Host "Response Status Code: "$response.StatusCode 
    Write-Host "Response Status Description: "$response.StatusDescription 
    $requestStream = $response.GetResponseStream() 
    $readStream = new-object System.IO.StreamReader $requestStream 
    new-variable db | Out-Host 
    $db = $readStream.ReadToEnd() 
    $readStream.Close() 
    $response.Close() 
    #Create a new file and write the web output to a file 
    $sw = new-object system.IO.StreamWriter($Outfile) 
    $sw.writeline($db) | Out-Host 
    $sw.close() | Out-Host 
} 

और मैं इसे इस तरह कहते हैं:

मैं करने के लिए कोशिश कर रहा था:

$SearchBoxBuilderURL = $SiteUrl + "nin_searchbox/DailySearchBoxBuilder.asp" 
$SearchBoxBuilderOutput="D:\ecom\tmp\ss2.txt" 
GetWebPage $SearchBoxBuilderURL $SearchBoxBuilderOutput 
1

मैं एक ऐसी ही स्थिति का सामना करना पड़ा BasicHTTP बाइंडिंग का उपयोग करके, SOAP सेवा का उपभोग करने वाली HTTP त्रुटि के मामले में कच्ची प्रतिक्रिया पढ़ें।

Stream not readable

तो, यह कोड मेरे लिए काम किया:

try 
{ 
    response = basicHTTPBindingClient.CallOperation(request); 
} 
catch (ProtocolException exception) 
{ 
    var webException = exception.InnerException as WebException; 

    var alreadyClosedStream = webException.Response.GetResponseStream() as MemoryStream; 
    using (var brandNewStream = new MemoryStream(alreadyClosedStream.ToArray())) 
    using (var reader = new StreamReader(brandNewStream)) 
     rawResponse = reader.ReadToEnd(); 
} 
+0

निश्चित रूप से, StreamReader.ReadToEnd() के साथ संयोजन में मेमोरीस्ट्रीम का उपयोग करके पहले से हीClosedStream.ToArray() कार्यों से UTF8 स्ट्रिंग को डीकोड करने के लिए। लेकिन यह 'rawResponse = System.Text.Encoding.UTF8.GetString (पहले से बंद हो गया है। ToArray())', और यह पढ़ने के लिए और अधिक सरल और आसान तरीका है ...;) – elgonzo

संबंधित मुद्दे