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

Can't connect to api endpoint from mobile app

我创建了一个 .NET Core web api 端点,我可以在其中检索一些我想在我的移动应用程序中显示的图像。我通过导航到该路线并通过邮递员在本地测试了端点,两者都工作正常(显示正确的响应)。但是,当我尝试从移动端访问端点时,它不起作用。我收到这个神秘错误:

System.Net.Http.HttpRequestException: Network subsystem is down

以下是更多异常信息:

System.Net.Http.HttpRequestException: Network subsystem is down ---> System.Net.Sockets.SocketException: Network subsystem is down
  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

我不确定我在移动端做错了什么。我知道要让邮递员显示它,我必须关闭 SSL 认证设置。我需要在移动端做类似的事情吗?

以下是我尝试调用端点的方式。我正在使用改装:

    public static class FetchMediaService
    {
        public static INevarroApi apiService;
        static string baseUrl = "https://localhost:5001";

        public static async Task<List<Uri>> CallImagesEndpoint()
        {
            apiService = RestService.For<INevarroApi>(baseUrl);
            var images = await apiService.GetImages();
            return images;
        }

    }

其中:

    public interface INevarroApi
    {
        [Get("/images")]
        Task<List<Uri>> GetImages();
    }

关于我的观点之一出现在我的代码隐藏中:

        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 项目)。

如果您使用的是 IISExpress,请尝试更改您的调试配置。

改为http://localhost:[PORT] to http://127.0.0.1:[PORT]

那么您应该可以在 android 中使用 http://10.0.2.2:[PORT]

访问它

红隼

应通过 Program.cs 中的 IHostBuilder 进行设置,如下所示:

public static IHostBuilder CreateHostBuilder(string[] args)
{
    return Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    // This should do it
                    webBuilder.UseUrls("http://127.0.0.1:5000");
                    webBuilder.UseStartup<Startup>();
                });
}