Веб-представление Xamarin.Forms: ERR_CONNECTION_REFUSED пытается загрузить локальный сервер с помощью EmbedIO - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь запустить локальный сервер для 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;
    }

Я уже давно бьюсь над этим, поэтому любая помощь будет принята.Если вам нужно больше деталей, дайте мне знать.

1 Ответ

0 голосов
/ 26 октября 2018

Оказывается, Android не имеет понятия "localhost" (по крайней мере, из того, что я могу прочитать).Вместо этого мне нужно найти IP-адрес моего устройства.Я сделал это с помощью следующего кода:

public class LocalWebServer: IDisposable
{
    public readonly string Url;

    ...

    public LocalWebServer(string filePath)
    {
        _filePath = filePath;

        Url = "http://" + GetLocalIpAddress() + ":8787/";
    }

    ...

    private static string GetLocalIpAddress()
    {
        var listener = new TcpListener(IPAddress.Loopback, 0);
        try
        {
            listener.Start();
            return ((IPEndPoint)listener.LocalEndpoint).Address.ToString();
        }
        finally
        {
            listener.Stop();
        }
    }
}

Код был найден в этом сообщении Xamarin Форумы: https://forums.xamarin.com/discussion/42345/simple-android-http-listener-not-working

...