2017-01-12 25 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) 
    { 

    }