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?
我试图在 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
希望对您有所帮助。而且我也没有太多经验,所以不要想当然:-)
继迈克尔对我之前的评论后