Как получить доступ к localhost из эмулятора Android? - PullRequest
0 голосов
/ 17 мая 2018

Я изучаю Xamarin из этого учебника - Зарегистрируйте пользователя в ASP.NET Identity из форм Xamarin . Все работает, если отправить запрос с почтальоном. Но если я хочу использовать эмулятор Android, он не работает. И я не могу использовать UWP, потому что режим разработчика должен быть включен, и у меня нет прав администратора на компьютере моей компании. Я включил режим разработчика на своем частном компьютере, и он работает на UWP, но он не работает на эмуляторе Android. В учебном пособии используется UWP и парень сказал, что для эмулятора андроида необходима некоторая конфигурация, но он не сообщил никаких подробностей.

Я прочитал много статей, и кажется, что проблема в связи между моим бэкэндом (работающим на localhost) и эмулятором Android. Правильно ли, что эмулятор Android - это отдельная машина, пытающаяся вызвать мой локальный хост? Я попытался изменить localhost на 127.0.0.1 или 10.0.2.2, и я попробовал все варианты из этой статьи . Но это не работает.

Я прав, что localhost должен быть изменен? Если да, то где? Или проблема в другом месте?

API-сервис Регистрация метода:

    public async Task<bool> RegisterAsync(string email, string password, string confirmPassword)
    {

        try
        {
            System.Diagnostics.Debug.WriteLine("Email: " + email);
            var client = new HttpClient();

            var model = new RegisterBindingModel
            {
                Email = email,
                Password = password,
                ConfirmPassword = confirmPassword
            };
            var json = JsonConvert.SerializeObject(model);

            HttpContent content = new StringContent(json);
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            var response = await client.PostAsync("http://localhost:49205/api/Account/Register", content); 

            if (response.IsSuccessStatusCode)
            {
                return true;
            }

            return false;
        }
        catch(Exception e)
        {
            System.Diagnostics.Debug.WriteLine("Error: " + e);
            throw;
        }
   }

Исключение, если я использую localhost:

{System.Net.Http.HttpRequestException: An error occurred while sending the request ---> System.Net.WebException: Error: ConnectFailure (Connection refused) ---> System.Net.Sockets.SocketException: Connection refused
at System.Net.Sockets.Socket.Connect (System.Net.EndPoint remoteEP) [0x000b6] in <bcdc1df2b3724ab69797f3819a126346>:0 
at System.Net.WebConnection.Connect (System.Net.HttpWebRequest request) [0x0016d] in <bcdc1df2b3724ab69797f3819a126346>:0 --- End of inner exception stack trace ---
at System.Net.HttpWebRequest.EndGetRequestStream (System.IAsyncResult asyncResult) [0x0003a] in <bcdc1df2b3724ab69797f3819a126346>:0 
at System.Threading.Tasks.TaskFactory`1[TResult].FromAsyncCoreLogic (System.IAsyncResult iar, System.Func`2[T,TResult] endFunction, System.Action`1[T] endAction, System.Threading.Tasks.Task`1[TResult] promise, System.Boolean requiresSynchronization) [0x0000f] in <fcbf47a04b2e4d90beafbae627e1fca4>:0 

Неверный запрос, если я использую 10.0.2.2:

{StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, 

Headers: {Server: Microsoft-HTTPAPI/2.0 Date: Thu, 17 May 2018 09:08:41 GMT Connection: close Content-Type: text/html; charset=us-ascii Content-Length: 334 }}

1 Ответ

0 голосов
/ 17 мая 2018

localhost относится к вашей локальной машине.Это распространенная ошибка, что люди думают, что эмулятор Android (или iOS в этом отношении) также является частью localhost, так как он работает на той же машине.Но это не так.

Эмуляторы работают как устройство на вашем устройстве и имитируют работу, как если бы это было физическое устройство.Он имеет свой собственный IP-адрес и не может достичь вашего localhost петлевого адреса.Ваше приложение работает как приложение на другом компьютере, а именно на эмуляторе.Это немного сбивает с толку при использовании UWP, так как этот действительно запускается как приложение на вашем локальном компьютере.

Именно поэтому вам придется использовать сетевой адрес вашей машины, где находится серверПриложение размещено.Этот адрес обычно начинается с 192.168.x.x или 10.x.x.x и может быть найден в сетевых настройках вашего компьютера.

Похоже, вы уже обнаружили это.При использовании адреса 10.0.2.2 вы получаете HTTP 400. Это означает, что что-то в вашем запросе было неверным, но из этого можно сделать вывод, что серверное приложение действительно может быть достигнуто.Но содержание запроса вызывает проблему в приложении вашего сервера.Поскольку вы не предоставляете никакого кода для конечной точки /Account/Register, невозможно сказать, что там происходит.Установите точку останова в коде своего сервера, повторите запрос и попытайтесь выяснить, почему активируется HTTP 400.

...