到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,请检查是什么导致它为空 –