2016-04-14 141 views
0

我有一個WebClient正在請求一個URL。我想在UWP應用程序中做同樣的事情,並且我看到我必須導入Microsoft.Net.Http並使用HttpClient。在PCL庫HttpRequestException使用HttpClient時?

WebClient client = new WebClient(); 
client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; 
string content = client.DownloadString(url); 

通過此:

所以我換成這(那是在一個類庫)

HttpClient client = new HttpClient(); 
string content = await client.GetStringAsync(url); 

現在我得到這個異常:

System.Net.Http.HttpRequestException occurred 
    HResult=-2147012867 
    Message=An error occurred while sending the request. 
    Source=System.Net.Http 
    StackTrace: 
     at System.Net.Http.HttpClientHandler.<SendAsync>d__1.MoveNext() 
    --- End of stack trace from previous location where exception was thrown --- 
     at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
     at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
     at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
     at XXXX.YYYY.MHDJ.ZZZZ.<ParsePage>d__4.MoveNext() 
    InnerException: 
     ErrorCode=-2147012867 
     HResult=-2147012867 
     Message=Le texte associé à ce code d’erreur est introuvable. 

Impossible d'établir une connexion avec le serveur 

     Source="" 
     StackTrace: 
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      at System.Net.Http.HttpHandlerToFilter.<SendAsync>d__1.MoveNext() 
     --- End of stack trace from previous location where exception was thrown --- 
      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
      at System.Net.Http.HttpClientHandler.<SendAsync>d__1.MoveNext() 
     InnerException: 

我不認爲問題是頭,那麼是什麼?

回答

0

HRESULT代碼-2147012867(十六進制)是0x80072EFD。前綴0x8007表示它實際上是HRESULT wrapper around a Win32 error code。原始的Win32錯誤代碼是0x2EFD

Win32 error code list告訴我們,值0x2EE00x2F8FERROR_INTERNET_*錯誤代碼,這聽起來像是正確的錯誤類型。下面的鏈接Win32ERROR_INTERNET_* error code listing後,我們可以把我們的錯誤代碼0x2EFD回十進制(12029),並發現它是錯誤ERROR_INTERNET_CANNOT_CONNECT

連接到服務器失敗的嘗試。

相當通用,並沒有太大的幫助。

我建議再次嘗試連接,確保您的應用程序具有適當的權限,並且設備實際上具有正常的Internet連接。如果這不起作用,請嘗試添加UserAgent標題;您的設備上的網絡堆棧可能會堅持使用它。

更新:跟蹤下來的錯誤代碼的含義是相當繁瑣的,所以我wrote an app to do it

+0

我已經添加了用戶代理,現在,同樣的錯誤,我試過10次連續和仍然無法正常工作。對於權利,我只添加了「Internet(客戶端)」,我不知道是否應該添加其他內容? – J4N

+0

如果您要撥打的網址是內部網域,您還需要檢查專用網絡功能。 –

+0

@ J4N:與'WebClient'一起使用的測試是否一樣? –

0

有很多方法可以做事,我並不是說這是最好的方法,但這是我構建方法的方法。這個例子就是我用來返回以JSON格式提供的美國State對象的列表。一個重要的說明......這是在通用Windows類庫中,而不是PCL ......但我不相信它使用了PCL無法訪問的任何內容。

using System; 
using System.Collections.Generic; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using Newtonsoft.Json; 
using System.Threading.Tasks; 

//IStateInfo is my model class interface 
public async Task<IList<IStateInfo>> GetAllStatesAsync() 
{ 
    List<IStateInfo> states = new List<IStateInfo>(); 
    try 
    { 
     using (var client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri("http://YourBaseApiHere"); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
      string url = "lookup/usstates"; 
      HttpResponseMessage response = await client.GetAsync(url); 
      if (response.IsSuccessStatusCode) 
      { 
       var json = await response.Content.ReadAsStringAsync(); 
       //deserialize into client class Newtonsoft JSON used here 
       var lst = JsonConvert.DeserializeObject<List<StateInfo>>(json); 
       states.AddRange(lst); 
      } 
      else 
      { 
       //notify of failed web call here 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     //notify of error 
    } 
    return states; 
} 
+0

我試圖做同樣的事情(使用基地址,使用MediaTypeWithQualityHeaderValue,調用相同的方法(但與我的URI),沒有運氣,仍然是完全相同的錯誤,我覺得它不直接與代碼,但我找不到與它相關的東西 – J4N

+0

發現有人有相同的錯誤,但在物聯網 - 最終成爲防火牆配置問題... http://stackoverflow.com/questions/32489813/httpclient-in-通用windows-app-running-on-windows-10-iot-core-throws- –

+0

我已經檢查過,但目前我沒有活動的防火牆(即使是一個窗口被禁用)也沒有殺毒軟件,我也只是試圖啓動Visual Studio作爲管理員,沒有運氣:( – J4N

1

遇到0x80072efd問題。如果沒有數天解決,花費我幾個小時。爲我工作的解決方案是從管理員命令提示符下鍵入以下命令:

netsh winhttp reset proxy

+0

全牛。謝謝! –