2013-02-22 52 views
20

जब मैं साइट www.livescore.com को HttpClient क्लास द्वारा कॉल करता हूं तो मुझे हमेशा "500" त्रुटि मिलती है। शायद सर्वर HttpClients से अवरुद्ध अनुरोध।एचटीपी क्लाइंट ब्राउज़र की तरह अनुरोध

1) वेबपृष्ठ से एचटीएमएल प्राप्त करने के लिए कोई और तरीका है?

2) मैं एचटीएमएल सामग्री प्राप्त करने के लिए हेडर कैसे सेट कर सकता हूं?

जब मैं ब्राउज़र में हेडर सेट करता हूं तो मुझे हमेशा एन्कोडेड सामग्री मिलती है।

http_client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml"); 
    http_client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate"); 
    http_client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); 
    http_client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1"); 

3) मैं इस समस्या को कैसे हल कर सकता हूं? कोई सुझाव?

मैं सी # में Windows 8 मेट्रो शैली App का उपयोग और HttpClientClass

+1

जब आप अपने ब्राउज़र के साथ इस url नहीं लाया तो क्या होगा? – Benny

+0

ब्राउज़र पेज में सही प्रदर्शित करना। एक नज़र डालें http://www.livescore.com/ –

+0

क्या आप पूरा फ़ंक्शन प्रकाशित कर सकते हैं? – tttony

उत्तर

48

ये रहा - ध्यान दें कि आप gzip इनकोडिंग-परिणाम वापस पहुंचने के as permleroy को संपीड़ित करने के लिए है:

private static async Task<string> GetResponse(string url) 
{ 
    var httpClient = new HttpClient(); 

    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml"); 
    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate"); 
    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); 
    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1"); 

    var response = await httpClient.GetAsync(new Uri(url)).ConfigureAwait(false); 

    response.EnsureSuccessStatusCode(); 
    using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) 
    using (var decompressedStream = new GZipStream(responseStream, CompressionMode.Decompress)) 
    using (var streamReader = new StreamReader(decompressedStream)) 
    { 
     return await streamReader.ReadToEndAsync().ConfigureAwait(false); 
    } 
} 

कॉल की तरह इस तरह के:

var response = await GetResponse("http://www.livescore.com/").ConfigureAwait(false); // or var response = GetResponse("http://www.livescore.com/").Result; 
+0

क्या "एसेप्ट-एन्कोडिंग" हेडर के बिना एक ही प्रभाव को पूरा करना संभव है? – pimbrouwers

0

मुझे लगता है कि आप बहुत कुछ है कि वे स्क्रीन scraping से डेवलपर्स को रोकने के लिए सब कुछ किया है हो सकता है।

अगर मैं इस कोड का उपयोग एक मानक सी # परियोजना से प्रयास करें:

The remote server returned an error: (403) Forbidden. 
+1

हाँ मुझे पता है :) लेकिन हम डेवलपर्स हैं और हमें इस तरह की समस्याओं को हल करने की जरूरत है :) –

+0

वहाँ भुगतान सेवाएं हैं। यह अवैध हैकिंग है। शायद आपको एक और साइट मिलनी चाहिए। – markoo

+2

अवैध? क्यूं कर? जब आप ब्राउज़र द्वारा इस साइट को कॉल करते हैं तो भी अवैध है? –

2

कई को ध्यान में रखना बातें:

var request = WebRequest.Create("http://www.livescore.com "); 
    var response = request.GetResponse(); 

मैं इस प्रतिक्रिया मिल।

  1. उस साइट के लिए आपको उपयोगकर्ता एजेंट प्रदान करने की आवश्यकता है, या यह 500 HTTP त्रुटि देता है।

  2. livecore.com पर एक GET अनुरोध live2.us पर 302 के साथ प्रतिक्रिया देता है। का अनुरोध livescore.us

  3. आप एक gzip संकुचित प्रतिक्रिया

इस कोड .NET 4 ग्राहकों का प्रोफाइल का उपयोग कर काम करता है को संपीड़ित करने की जरूरत है आप पुनर्निर्देशन संभालने की ज़रूरत है या सीधे, मैं तुम्हें अगर यह पता लगाने दूँगा यह एक विंडोज स्टोर ऐप फिट बैठता है।

var request = (HttpWebRequest)HttpWebRequest.Create("http://www.livescore.com"); 
request.AllowAutoRedirect = true; 
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17"; 

string content; 

using (var response = (HttpWebResponse)request.GetResponse()) 
using (var decompressedStream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress)) 
using (var streamReader = new StreamReader(decompressedStream)) 
{ 
    content = streamReader.ReadToEnd(); 
} 
+0

ओपी 'HttpWebRequest' का उपयोग नहीं कर रहा है, बल्कि' HttpClient'। लेकिन आप अंक 1 और 3 के बारे में स्पॉट-ऑन हैं। –

+1

आप सही हैं; ठीक है ओपी एचटीपी क्लाइंट का उपयोग करने पर प्रतीत नहीं होता है (उसका पहला प्रश्न देखें) तो उम्मीद है कि यह अभी भी उपयोगी होगा :) – siger

+0

धन्यवाद! अच्छा जवाब है लेकिन Winodws 8 में केवल HttpClient समर्थित है। –

20

रूप में अच्छी तरह यह कोशिश कर सकते हैं संपीड़न समर्थन जोड़ने के लिए:

var compressclient = new HttpClient(new HttpClientHandler() 
{ 
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip 
}); 

यह हेडर भी जोड़ता है।

एक ही धागे समर्थन के मुताबिक Windows स्टोर ढांचे में है: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/429bb65c-5f6b-42e0-840b-1f1ea3626a42/httpclient-data-compression-and-caching?prof=required