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 的代理问题