2017-06-06 84 views
2

我正在嘗試開發一個Xamarin.Forms或Xamarin.iOS/Xamarin.Droid原生應用程序,它可以對我的服務器進行Web API調用。我得到錯誤說HttpRequestException拋出。一旦我搜索瞭解決方案,它說這是因爲它無法到達套接字,但我無法將其安裝到PCL項目。所以我檢查這個解決方案,他們說使用代理來獲得服務。來自PCL的Xamarin WebAPI調用

這是我的問題。我已經嘗試在PCL中創建一個代理來連接到.Droid或.iOS項目中的服務,以便他們可以使用這些套接字(儘管我不認爲該服務應該在應用程序項目本身中,因爲重複的代碼)。但是代理類不能引用服務,因爲它不在項目中。

這是我的RestService類。

public class RestService : IRestService 
{ 
    private const string BASE_URI = "http://xxx.xxx.xxx.xxx/"; 
    private HttpClient Client; 
    private string Controller; 

    /** 
    * Controller is the middle route, for example user or account etc. 
    */ 
    public RestService(string controller) 
    { 
     Controller = controller; 
     Client = new HttpClient(); 
    } 

    /** 
    * uri in this case is "userId?id=1". 
    */ 
    public async Task<string> GET(string uri) 
    { 
     try 
     { 
      Client.BaseAddress = new Uri(BASE_URI); 
      Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
      var fullUri = String.Format("api/{0}/{1}", Controller, uri); 
      var response = Client.GetAsync(fullUri); 
      string content = await response.Result.Content.ReadAsStringAsync(); 
      return content; 
     } 
     catch (Exception e) 
     { 
      return null; 
     } 
    } 
} 

我找不到任何好的教程在線如何讓這個工作和任何幫助在這方面將不勝感激。

+0

你檢查這 - https://stackoverflow.com/questions/15143107/httpclient-httprequestexception和這個 - https://stackoverflow.com/questions/31131658/xamarain-web-api –

+0

只花了看看這兩個鏈接。這兩個解決方案都不是問題,因爲我沒有使用IIS,並且給出的郵件適用於郵遞員。 – Tomaltach

+0

@Tmaltach避免整體阻止呼叫。將它移到響應中並沒有什麼區別。它仍然是一個阻止電話 – Nkosi

回答

2

你混合異步/等待和阻塞調用.Result

public async Task<string> GET(string uri) { 
    //...other code removed for brevity 

    var response = Client.GetAsync(fullUri).Result; 

    //...other code removed for brevity 
} 

這是造成導致你不能夠去插座死鎖。

使用異步/等待時,您需要一路異步,並避免阻止像.Result.Wait()這樣的調用。

public async Task<string> GET(string uri) { 
    try { 
     Client.BaseAddress = new Uri(BASE_URI); 
     Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     var fullUri = String.Format("api/{0}/{1}", Controller, uri); 
     var response = await Client.GetAsync(fullUri); 
     var content = await response.Content.ReadAsStringAsync(); 
     return content; 
    } catch (Exception e) { 
     return null; 
    } 
} 
+0

對不起,混淆了代碼行。在我在這裏發佈代碼之前嘗試了幾種方法,並且它有點混雜。我現在已經修復了這個問題,但仍然因爲套接字而失敗。 – Tomaltach

+0

@Tmaltach,因爲你仍在使用阻止呼叫。擺脫'.Result'。這是導致該塊。 – Nkosi

+0

@Tmaltach是否解決了您的問題? – Nkosi