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

Xamarin iOS simulator can't connect to Rest API

我试图在 Visual Studio 2013 年(第一次)建立一个 Xamarin 项目。

我正在为我的 API 消费者 类 使用便携式 Class 库,其中(除其他方法外)包含如下 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;它工作得很好。 但是, 当我 运行 iOS 应用程序通过 VS13 和 Xamarin 构建主机在我的 Mac 上时,我在尝试连接到API(使用便携式 Class 库中的 excat 相同方法)。例外情况是:

System.Net.WebExceptionStatus.ConnectFailure

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

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

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

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

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

var response = await client.GetAsync(endpoint);

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

您最好使用 HttpWebRequest,它是基础 Class 库 (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

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

继迈克尔对我之前的评论后 , it appears the solution is to tune your OS X Firewall, possibly as in this related question: How do I get the Mac OS X Firewall to permanently allow my iOS app?