Я пытаюсь запустить локальный сервер для Xamarin.Forms WebView.Это для того, чтобы обойти CORS, и поэтому HTML может быть структурирован как обычная страница.Это работает для UWP и iOS, но Android всегда предлагает ERR_CONNECTION_REFUSED.Некоторые дополнительные детали / вещи, которые я попробовал:
- Приложение работает на своем собственном сервере, поэтому это не тот случай, когда я пытаюсь получить доступ к серверу на отдельном устройстве.
- Доступ к Интернету разрешен.
- Путь к файлам существует, в противном случае веб-сервер не запустится.
- Ссылка на пакет nuget локального сервера: https://github.com/unosquare/embedio
Ниже приводится схема кода, который я использую.На практике я использую пользовательский рендерер, внедряю Javascript для доступа к функциям платформы и т. Д., Но это должно упростить его:
Класс, который создает и запускает WebServer с EmbedIO:
public class LocalWebServer: IDisposable
{
public static string Url = "http://localhost:8787/";
private readonly string _filePath;
private WebServer _server;
public LocalWebServer(string filePath)
{
_filePath = filePath;
}
public void StartWebServer()
{
_server = new WebServer(Url);
_server.RegisterModule(new LocalSessionModule());
_server.RegisterModule(new StaticFilesModule(_filePath));
_server.Module<StaticFilesModule>().UseRamCache = true;
_server.Module<StaticFilesModule>().DefaultExtension = ".html";
_server.Module<StaticFilesModule>().DefaultDocument = "index.html";
_server.Module<StaticFilesModule>().UseGzip = false;
Task.Factory.StartNew(async ()=>
{
Debug.WriteLine("Starting Server");
await _server.RunAsync();
});
}
public void Dispose()
{
_server?.Dispose();
}
}
Код, который запускает сервер и отображает веб-просмотр:
public App()
{
InitializeComponent();
//Create and display a Webview
_webView = new WebView();
MainPage = new ContentPage()
{
Content = _webView,
};
}
protected override async void OnStart()
{
//Service which can initialize app for first time use, and stores
//the folder location for the html page on each platform
var htmlService = DependencyService.Get<IHandleHtmlContentService>();
//Local webserver
var localWebServer = new LocalWebServer(htmlService.DirectoryPath);
//This is just a function that loads the html content from the
//bundle resource or assets into a folder. Will only really
//matter during the first time the App boots up.
await htmlService.InitializeHtmlContent();
//Start the Webserver
localWebServer.StartWebServer();
//Navigate to the webserver
_webView.Source = LocalWebServer.Url;
}
Я уже давно бьюсь над этим, поэтому любая помощь будет принята.Если вам нужно больше деталей, дайте мне знать.