2017-01-12 26 views
2

到Xamarin表格/ Visual Studio的2015年HttpClient的請求我,而新的,但這裏是我目前的狀況。 我有一個Xamarin Forms項目在Visual Studio與Android,iOS和Windows Phone子項目。我有以下功能登錄:Xamarin窗體的Visual Studio不工作的iOS

public async Task<Tuple<bool, object>> Login(LoginCredentials credentials) 
    { 
     var loginUrl = apiUrl + "/login"; 
     var json = JsonConvert.SerializeObject(credentials); 
     var content = new StringContent(json, Encoding.UTF8, "application/json"); 
     try 
     { 
      Debug.WriteLine("start of try block"); 
      HttpResponseMessage response = await client.PostAsync(loginUrl, content); 
      Debug.WriteLine("this will not print on iOS"); 
      string bodyStr = await response.Content.ReadAsStringAsync(); 
      if (response.IsSuccessStatusCode) 
      { 
       // code that does stuff with successful response 
      } else 
      { 
       // code that does stuff with bad response 
      } 
     } catch (Exception e) 
     { 
      Debug.WriteLine(e); 
      return new Tuple<bool, object>(false, e.Message); 
     } 
    } 

你可以從Debug.WriteLine()的看到,一個異常被拋出就行了:

HttpResponseMessage response = await client.PostAsync(loginUrl, content); 

唯一的例外是System.NullReferenceException: Object reference not set to an instance of an object

然而,這異常只發生在iOS上。 Android和Windows Phone都可以成功發出此請求。

我的第一個假設是它是Apple的ATS這是有道理的,因爲我的服務器只是一個不使用https的開發實例。所以我粘貼了

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
</dict> 

到iOS項目的Info.plist。仍然沒有運氣。

我還在其他地方讀過一個問題,這個問題是爲了確保Windows上的Visual Studio和Mac上的Xamarin都是最新的,我也確認了這一點。

apiUrl不是http://localhost我使用我的本地網絡上的IP(因爲Mac和iOS模擬器運行在不同的機器上),我已經證實是正確的。

如果我必須在這一點上猜測,我會說這仍然是ATS設置沒有設置正確的東西,但我一直無法證實這一點。不知道該從哪裏出發。我會繼續調試並添加更新,但任何幫助將非常感激。

更新:

至於建議的Oleg Bogdanov,運行iOS當我的客戶端實例不是實例正確只。

當調試iOS版: iOS HttpClient Debug

在調試機器人: Android HttpClient Debug

現在的任務變得弄清楚爲什麼這是iOS上發生。這是client初始化代碼。我已經嘗試了目前的位置以及評論的位置。

public class API 
{ 
    public HttpClient client = new HttpClient(); 
    public string apiUrl = "http://myApiUrl"; 

    public API() 
    { 
     //this.client = new HttpClient(); 
    } 

    public async Task<Tuple<bool, object>> Login(LoginCredentials credentials) 
    { 
     // login function code 
    } 
} 

當我有任何新的進展時,我會繼續調試併發布另一個更新。像往常一樣,任何幫助不勝感激。

+0

您是否確定當您嘗試「發佈」您的請求時會將'client'實例化? – Demitrian

+0

是的。除非由於某些原因,它會在Android和Windows上,並且不會在iOS – DerFlickschter

+1

仍然是您的客戶端實例是null,請檢查是什麼導致它爲空 –

回答

1

我找到了解決辦法here代碼。

我跑到NuGet Install-Package Microsoft.Net.Http到便攜式項目,它現在工作。

0

我不認爲有任何與ATS。我用本地主機共享本地服務器創建了一個POC。請檢查下面這正爲我的POC

對於POST請求

try 
    { 
     HttpClient client = new HttpClient(); 
     var uri = new Uri("http://localhost/RegisterDevice"); 
     string data = "{\"username\": \"ADMIN\",\"password\": \"123\"}"; 
     var content = new StringContent(data, Encoding.UTF8, "application/json"); 

     HttpResponseMessage response = null; 
     response = await client.PostAsync(uri, content); 
     Util.HideLoading(); 
     if (response.IsSuccessStatusCode) 
     { 
      System.Diagnostics.Debug.WriteLine(@"Success"); 
     } 
     else 
     { 
      System.Diagnostics.Debug.WriteLine(@"Fail");     
     } 
    } 
    catch (Exception ex) 
    { 

    }