模拟器上的 Xamarin Android 应用程序无法从本地托管的 asp.net core webapi 获取数据:操作已取消

问题描述 投票:0回答:1

我正在开发一个带有 Xamarin 表单的 Android 应用程序,该应用程序从 ASP.NET core webapi 获取数据。 但到目前为止,它似乎在以下行停止工作:

HttpResponseMessage response = await client.GetAsync(url);

下面是我到目前为止的代码。

var content = "";

var client = new HttpClient();

var url = @"https://10.0.0.2:7294/menu";

client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = await client.GetAsync(url);

content = await response.Content.ReadAsStringAsync();

var Items = JsonConvert.DeserializeObject<ObservableCollection<MenuItemModel>>(content);

我一直在互联网上寻找解决方案,实际上我找到了具有相同问题的帖子,但我在这些帖子中找不到任何解决方案。

我可以通过 Chrome 浏览器浏览到该 url,但在应用程序中,它似乎尝试从该 URL 获取数据,然后在未指定的时间后抛出以下错误:

System.OperationCanceledException: 'The operation was canceled.'

我相信这是一些我还没有找到的愚蠢设置,但我似乎找不到解决方案。

如果您需要更多信息,请告诉我,因为我束手无策。

感谢您的帮助。

起初我以为这是一个线程池错误,所以我尝试使用ConfigureAwait(false),但这并没有改变任何东西。所以我尝试尽可能简化代码以避免任何这些问题。

我在示例中使用的特定端口的入站防火墙规则中添加了例外

我尝试设置那些 Android 模拟器代理设置并恢复它

我添加了权限 INTERNET、ACCESS_NETWORK_STATE、ACCESS_WIFI_STATE

我发现微软的这个链接也没有解决任何问题: https://learn.microsoft.com/en-us/xamarin/cross-platform/deploy-test/connect-to-local-web-services

最后,我发现了以下建议,但这也不起作用:

HttpClientHandler clientHandler = new HttpClientHandler
{
    ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }
};
HttpClient client = new HttpClient(clientHandler);
c# asp.net-web-api xamarin.forms xamarin.android android-emulator
1个回答
0
投票

您在 Xamarin.Forms 应用程序中向本地服务器发出 HTTP 请求时似乎遇到了一个常见问题。 System.OperationCanceledException:“操作已取消。”由于多种原因,可能会发生错误。以下是一些排除故障并可能解决问题的步骤:

  1. 验证API服务 检查 API 是否正在运行:确保 ASP.NET Core WebAPI 正在运行且可访问。 测试 API:使用 Postman 等工具确保 API 正确响应请求。

  2. 模拟器中的地址本地主机参考 从模拟器访问 localhost 或 127.0.0.1 将引用模拟器或设备本身,而不是运行服务器的主机。由于您使用的是 IP 10.0.0.2,请确保它正确指向运行 ASP.NET Core WebAPI 的主机。 如果您在 Android 模拟器上进行测试,请尝试使用 10.0.2.2 访问本地开发服务器。该 IP 是您的主机环回接口(即您的开发机器)的特殊别名。

  3. 检查网络权限 您提到添加网络权限,这很好。确保它们在您的 Android 清单文件中正确设置:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  1. (暂时)禁用 SSL 证书验证 如果问题与 SSL 证书相关,禁用 SSL 证书验证会有所帮助。这应该仅用于测试目的,因为它不安全:
HttpClientHandler clientHandler = new HttpClientHandler
{
  ServerCertificateCustomValidationCallback = (sender, cert, chain, 
  sslPolicyErrors) => { return true; }
};
HttpClient client = new HttpClient(clientHandler);
  1. 增加超时时间 有时默认超时可能太短。尝试增加它:
client.Timeout = TimeSpan.FromSeconds(30); // Example: 30 seconds
  1. 检查 URL 和网络配置 确保 URL 正确。如果您使用 HTTPS,请确保 ASP.NET Core 应用程序配置为支持 HTTPS 并且 SSL 证书受信任。 如果在真实设备上运行,请确保设备和服务器位于同一网络。

  2. 调试和日志记录 使用 try-catch 块捕获任何异常并记录详细的错误消息。 调试应用程序以查看到底哪里出了问题并获得更多见解。

  3. 检查 ASP.NET Core 配置 确保在 ASP.NET Core 应用程序中正确配置 CORS(跨源资源共享),以允许来自 Xamarin 应用程序的请求。

  4. 使用不同的 HTTP 客户端库 作为最后的手段,您可以尝试使用不同的 HTTP 客户端库(例如 Refit 或 RestSharp)来查看问题是否仍然存在。

如果问题仍然存在,您可能会发现检查可能阻止请求的网络配置和防火墙可能会有所帮助,或者尝试在真实设备而不是模拟器上运行 Xamarin 应用程序以进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.