到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上發生。這是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
}
}
當我有任何新的進展時,我會繼續調試併發布另一個更新。像往常一樣,任何幫助不勝感激。
您是否確定當您嘗試「發佈」您的請求時會將'client'實例化? – Demitrian
是的。除非由於某些原因,它會在Android和Windows上,並且不會在iOS – DerFlickschter
仍然是您的客戶端實例是null,請檢查是什麼導致它爲空 –