【问题标题】:Xamarin iOS simulator can't connect to Rest APIXamarin iOS 模拟器无法连接到 Rest API
【发布时间】:2015-07-12 10:01:43
【问题描述】:

我正在尝试在 Visual Studio 2013 中设置一个 Xamarin 项目(第一次)。

我正在为我的 API 使用者类使用可移植类库,它(以及其他方法)包含如下 GET 方法:

    private static async Task<string> Get(string endpoint)
    {

        try
        {
            var client = new HttpClient();
            client.BaseAddress = new Uri(API_URL);
            client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));
            var response = client.GetAsync(endpoint).Result;
            string content = await response.Content.ReadAsStringAsync();
            return content;
        }
        catch (Exception ex)
        {
            var t = ex.Message;
        }

        return null;
    }

API 设置在带有 Azure 的公开服务器上。我已经从一个 Web 项目测试了 API;它工作得很好。 但是,当我在我的 Mac 上通过 VS13 和 Xamarin Build 主机运行 iOS 应用程序时,尝试连接到 API 时出现异常(使用可移植类库中的 excat 相同方法)。例外是:

System.Net.WebExceptionStatus.ConnectFailure

没有进一步的描述。 我已经测试过 API 可以从充当构建主机的 Mac 访问,这让我想知道,是否存在通过 iOS 应用程序连接到 API 的某些条件,而我不知道。

我没有任何构建应用程序的经验,这是我的第一次尝试。就像我说的;通过 Web 项目访问时,API 工作得很好。我在这里想念什么?

【问题讨论】:

    标签: xamarin xamarin.mac


    【解决方案1】:

    根据 Michael 对我之前的 response 的评论,看来解决方案是调整您的 OS X 防火墙,可能如以下相关问题:How do I get the Mac OS X Firewall to permanently allow my iOS app?

    【讨论】:

      【解决方案2】:

      您是否检查过是否可以连接到任何其他服务?例如,也许可以尝试使用谷歌。如果它不起作用,那么我也会检查一下:

      var response = client.GetAsync(endpoint).Result;
      

      因为这东西也可能是麻烦制造者。如果处理异步任务,你不应该那样使用它们,而是等待它们(这样你就会得到结果):

      var response = await client.GetAsync(endpoint);
      

      【讨论】:

      • 感谢您的回答。我尝试在 Xamarin 工作室中直接从 Mac 执行代码,它可以从那里工作。我注意到当我这样做时,我的 Mac 会询问我是否要允许来自 iPhone 模拟器的网络连接。当我通过构建主机运行它时,这个提示没有显示,我认为这就是问题所在。
      【解决方案3】:

      从成熟的 .net 框架中使用 System.net.Http.HttpClient 似乎是您的问题。如您所见,当您引用该程序集时,它会减少项目的目标。

      您最好使用HttpWebRequest,它是基类库 (BCL) 的一部分,可以与 Android/iOs/WinPhone 配合使用。

      试试这个:

          private WebRequest _request;
      
          private void DoRequest(string endpoint)
          {
              _request = WebRequest.Create(new Uri(endpoint))
              _request.BeginGetResponse(RequestCallback, null);
          }
      
          private void RequestCallback(IAsyncResult result)
          {
              Stream stream = _request.EndGetResponse(result).GetResponseStream();
              // Process your stream
              ...
          }
      

      这里还有一些关于使用 HttpClient 问题的信息:http://forums.xamarin.com/discussion/7719/using-httpclient

      我希望这会有所帮助。而且我也没有太多经验,所以不要想当然:-)

      【讨论】:

      • 感谢您的回答。我实际上正在使用一个可移植的 Http 库,它是专门为 PCL 和 Android 和 iOS 端口制作的。所以这不是问题。我尝试在 Xamarin 工作室中直接从 Mac 执行代码,它可以从那里工作。我注意到当我这样做时,我的 Mac 会询问我是否要允许来自 iPhone 模拟器的网络连接。当我通过构建主机运行它时,这个提示没有显示,我认为这就是问题所在。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2021-04-29
      相关资源
      最近更新 更多