Eur*_*e01 1 c# xamarin.android xamarin xamarin.forms refit
我创建了一个 .NET Core Web api 端点,可以在其中检索一些想要在移动应用程序中显示的图像。我通过导航到该路线并通过邮递员在本地测试了端点,两者都工作正常(显示正确的响应)。但是,当我尝试从移动端访问端点时,它不起作用。我收到这个神秘的错误:
System.Net.Http.HttpRequestException: Network subsystem is down
Run Code Online (Sandbox Code Playgroud)
以下是更多异常信息:
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
Run Code Online (Sandbox Code Playgroud)
我不确定我在移动端做错了什么。我知道邮递员要显示它,我必须关闭 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;
}
}
Run Code Online (Sandbox Code Playgroud)
在哪里:
public interface INevarroApi
{
[Get("/images")]
Task<List<Uri>> GetImages();
}
Run Code Online (Sandbox Code Playgroud)
OnAppearing 在我的代码隐藏中表达了我的观点之一:
protected override async void OnAppearing()
{
DualScreenLayoutInfo.PropertyChanged += OnFormsWindowPropertyChanged;
DualScreenInfo.Current.PropertyChanged += OnFormsWindowPropertyChanged;
var images = await FetchMediaService.CallImagesEndpoint(); //Where the exception is thrown
}
Run Code Online (Sandbox Code Playgroud)
我上面做错了什么?
我正在 Mac OSX 上的 Android 10 (API 29) 模拟器上对此进行测试,后端代码使用 Visual Studio for Mac 在本地运行(后端是 .NET Core 3.1 Web api 项目)。
如果您使用 IISExpress,请尝试更改调试配置。
将http://localhost:[PORT]更改为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>();
});
}
Run Code Online (Sandbox Code Playgroud)