2012-09-12 143 views
0

我想從遠程服務器讀取xml文件,但不知何故服務器不響應我的請求。因此,Gzip拋出「GZip頭部中的幻數不正確」異常。任何想法?無法讀取XML數據

private static string GetFile() 
    { 
     Uri uri = new Uri(@"http://www.iddaa.com.tr/XML/IDDAAMACPROGRAMI/index.htm?iddaadrawid=12.09.2012&iddaadrawide=13.09.2012&foraccess=KSsec654"); 

     string xmlFile; 

     HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create(uri); 
     req.UserAgent = 
      "MOZILLA/5.0 (WINDOWS NT 6.1; WOW64) APPLEWEBKIT/537.1 (KHTML, LIKE GECKO) CHROME/21.0.1180.75 SAFARI/537.1"; 
     req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
     req.Headers.Add("Accept-Encoding", "gzip,deflate"); 


     using (GZipStream zip = new GZipStream(req.GetResponse().GetResponseStream(), 
               CompressionMode.Decompress)) 
     { 
      var reader = new StreamReader(zip); 
      xmlFile = reader.ReadToEnd(); 
     } 

     return xmlFile; 
    } 

回答

5

您不需要使用gzip。如果服務器將gzip頭部發送到響應,HttpWebRequest將自動爲您執行此操作。

但是你可以使用進一步簡化您的代碼WebClient

private static string GetFile() 
{ 
    using (var client = new WebClient()) 
    { 
     client.Headers[HttpRequestHeader.UserAgent] = "MOZILLA/5.0 (WINDOWS NT 6.1; WOW64) APPLEWEBKIT/537.1 (KHTML, LIKE GECKO) CHROME/21.0.1180.75 SAFARI/537.1"; 
     client.Headers[HttpRequestHeader.Accept] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
     client.Headers[HttpRequestHeader.AcceptEncoding] = "gzip,deflate"; 
     var xmlFile = client.DownloadString("http://www.iddaa.com.tr/XML/IDDAAMACPROGRAMI/index.htm?iddaadrawid=12.09.2012&iddaadrawide=13.09.2012&foraccess=KSsec654"); 
     return xmlFile; 
    } 
} 

,或者引入新HttpClient類.NET 4.5:

private async Task<string> GetFile() 
{ 
    using (var client = new HttpClient() { BaseAddress = new Uri("http://www.iddaa.com.tr") }) 
    { 
     client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("MOZILLA", "5.0")); 
     client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("(WINDOWS NT 6.1; WOW64)")); 
     client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("APPLEWEBKIT", "537.1")); 
     client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("(KHTML, LIKE GECKO)")); 
     client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("CHROME", "21.0.1180.75")); 
     client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("SAFARI", "537.1")); 

     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html")); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xhtml+xml")); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml", 0.9)); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*", 0.8)); 

     client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip")); 
     client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate")); 
     var result = await client.GetAsync("/XML/IDDAAMACPROGRAMI/index.htm?iddaadrawid=12.09.2012&iddaadrawide=13.09.2012&foraccess=KSsec654"); 
     result.EnsureSuccessStatusCode(); 
     return await result.Content.ReadAsStringAsync(); 
    } 
} 
+0

Dimitrow我刪除Gzip已組成部分,它的工作, 謝謝! – ozgun

+0

@ user712847,如果此答案幫助您解決了您遇到的問題,請考慮將其標記爲答案,方法是單擊旁邊的勾號:http://meta.stackexchange.com/questions/5234/how-does-accepting- an-answer-work –

+0

非常感謝。我期待找回可能發生在我的REST HTTP GET請求上的XML錯誤響應......並且這一行'return await result.Content.ReadAsStringAsync();'從你上面的代碼示例中,拯救了我的一天! – Vinu