无法从移动应用程序连接到 API 端点。
无法从移动应用程序连接到 API 端点。
我创建了一个.NET Core的Web API端点,可以从中获取一些图片,我想在我的移动应用程序中显示这些图片。我通过在本地导航到该路由和使用Postman进行测试,两者都正常工作(显示正确的响应)。然而,当我尝试从移动端访问该端点时,它不起作用。我收到了这个晦涩的错误信息:System.Net.Http.HttpRequestException: 网络子系统已关闭
。以下是更多的异常信息:
System.Net.Http.HttpRequestException: 网络子系统已关闭 ---> System.Net.Sockets.SocketException: 网络子系统已关闭 at System.Net.Http.ConnectHelper.ConnectAsync (System.String host, System.Int32 port, System.Threading.CancellationToken cancellationToken) [0x000c8] in /Users/builder/jenkins/workspace/archive-mono/2019-10/android/release/external/corefx/src/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/ConnectHelper.cs:65
。我不确定在移动端做错了什么。我知道为了让Postman显示,我必须关闭SSL证书设置。我在移动端需要做类似的操作吗?以下是我尝试调用端点的方式。我使用了Refit库:
public static class FetchMediaService { public static INevarroApi apiService; static string baseUrl = "https://localhost:5001"; public static async Task> CallImagesEndpoint() { apiService = RestService.For
(baseUrl); var images = await apiService.GetImages(); return images; } }
其中:
public interface INevarroApi { [Get("/images")] Task> GetImages(); }
在我的一个视图的代码后台中的OnAppearing方法中:
protected override async void OnAppearing() { DualScreenLayoutInfo.PropertyChanged += OnFormsWindowPropertyChanged; DualScreenInfo.Current.PropertyChanged += OnFormsWindowPropertyChanged; var images = await FetchMediaService.CallImagesEndpoint(); //Where the exception is thrown }
以上是我做错了什么?我在Mac OSX上的Android 10(API 29)模拟器上进行测试,后端代码在使用Visual Studio for Mac运行的本地(后端是.NET Core 3.1 Web API项目)。
问题原因:移动应用无法连接到API端点。
解决方法:
1. 如果使用的是IISExpress,请尝试更改调试配置:
将"http://localhost:[PORT]"更改为"http://127.0.0.1:[PORT]"。
然后可以在Android中使用"http://10.0.2.2:[PORT]"访问。
2. 对于Kestrel服务器,需要在Program.cs文件中通过IHostBuilder进行设置:
使用以下代码:
public static IHostBuilder CreateHostBuilder(string[] args) { return Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseUrls("http://127.0.0.1:5000"); webBuilder.UseStartup(); }); }
3. 如果以上方法无法解决问题,可以尝试以下步骤:
- 确保Kestrel服务器正常工作,可以通过Safari访问"http://127.0.0.1:5000"确认。
- 如果已经将Kestrel设置为使用"127.0.0.1:5000",则可以在Xamarin应用中使用"10.0.2.2:5000"访问API。
- 关于为什么使用10.0.2.2 IP,可以参考这个链接:stackoverflow.com/questions/9808560/…
无法连接到移动应用的API端点可能是由于调试配置或服务器设置导致的。通过更改调试配置或正确设置服务器的URL,可以解决这个问题。