无法从移动应用程序连接到 API 端点。

25 浏览
0 Comments

无法从移动应用程序连接到 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项目)。

0
0 Comments

问题原因:移动应用无法连接到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,可以解决这个问题。

0