Xamarin iOS 模拟器无法连接到 Rest API

Posted

技术标签:

【中文标题】Xamarin iOS 模拟器无法连接到 Rest API【英文标题】:Xamarin iOS simulator can't connect to 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 工作得很好。我在这里想念什么?

【问题讨论】:

【参考方案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 模拟器的网络连接。当我通过构建主机运行它时,这个提示没有显示,我认为这就是问题所在。

以上是关于Xamarin iOS 模拟器无法连接到 Rest API的主要内容,如果未能解决你的问题,请参考以下文章

在 InAppBillingPlugin for Xamarin 之后,应用内购买无法连接到 iTunes 商店 ios 12

从 Visual Studio 2019 Xamarin.iOS 连接到 Mac 的代理问题

Xamarin iOS 项目中的自动预配

VS Xamarin '无法连接到 Mac.local'

expo ios 模拟器“无法连接到开发服务器”错误(适用于浏览器)

Xamarin iOS 模拟器问题 - 找不到设备