【发布时间】:2021-12-31 11:09:58
【问题描述】:
我的场景如下。我有一个 Android 模拟器,它通过一个应用程序托管一个 EmbedIO Web 服务器。当我尝试从主机 (Mac) 浏览器访问 Web 服务器的 URL 时,我收到 ERR_EMPTY_RESPONSE 错误。
我已通过 ADB 发出以下端口转发命令:
adb forward tcp:8080 tcp:8080
在浏览器中,我正在导航到:http://localhost:8080/api/ChangeBackGround 并且 Android 模拟器 Web 服务器正在监听:http://10.0.2.16:8080/api/ChangeBackGround
这是在 Xamarin Forms 应用程序(在 Android 模拟器上运行)中启动 Web 服务器的代码:
public static class WebServerFactory
{
public static WebServer CreateWebServer<T>(string url, string baseRoute)
where T : WebApiController, new()
{
var server = new WebServer(url)
.WithWebApi(baseRoute, api => api.WithController<T>());
// Listen for state changes.
server.StateChanged += (s, e) => Debug.WriteLine($"WebServer New State - {e.NewState}");
return server;
}
}
public class EventController : WebApiController
{
[Route(HttpVerbs.Get, "/ChangeBackGround")]
public void ChangeBackGround()
{
Device.BeginInvokeOnMainThread(() =>
{
App.Current.MainPage.BackgroundColor = Color.Green;
});
}
}
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new MainPage();
}
private WebServer _WebServer;
protected override void OnStart()
{
var localIPAddress = GetLocalIPAddress();
var url = $"http://{localIPAddress}:8080";
Task.Factory.StartNew(async () =>
{
_WebServer = WebServerFactory.CreateWebServer<EventController>(url, "/api");
await _WebServer.RunAsync();
});
((MainPage)MainPage).Url = url;
}
private string GetLocalIPAddress()
{
var IpAddress = Dns.GetHostAddresses(Dns.GetHostName()).FirstOrDefault();
if (IpAddress != null)
return IpAddress.ToString();
throw new Exception("Could not locate IP Address");
}
protected override void OnSleep()
{
}
protected override void OnResume()
{
}
}
该方案目前适用于 iOS 模拟器和 Android 物理设备。但即使我设置了端口转发规则,我也总是得到 ERR_EMPTY_RESPONSE。
任何帮助将不胜感激。
【问题讨论】:
标签: xamarin.forms android-emulator adb embedio