如何从android模拟器访问localhost?

时间:2018-05-17 10:34:48

标签: asp.net asp.net-web-api xamarin.forms android-emulator localhost

我正在从本教程中学习Xamarin - Signup user to ASP.NET Identity from Xamarin Forms。如果邮递员发送请求,一切正常。但如果我想使用Android模拟器它不起作用。我不能使用UWP,因为必须启用开发人员模式,而且我的公司计算机上没有管理员权限。我在我的私人计算机上启用了开发人员模式,它正在使用UWP,但它不能在Android模拟器上运行。在教程中使用UWP和那个人说,对于android模拟器需要一些配置,但他没有告诉任何细节。

我阅读了很多文章,似乎问题在于我的后端(在localhost上运行)和android模拟器之间的连接。 android模拟器是一个试图调用我的localhost的独立机器是否正确?我尝试将localhost更改为127.0.0.1或10.0.2.2,并尝试了this article中的所有选项。但它没有用。

我是否正确必须更改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 }}

2 个答案:

答案 0 :(得分:2)

localhost指的是您的本地计算机。这是一个常见的错误,人们认为Android模拟器(或iOS就此而言)也是localhost的一部分,因为它在同一台机器上运行。但事实并非如此。

仿真器作为设备中的设备运行,并模仿工作,就像它是物理设备一样。它拥有自己的IP地址,无法访问您的localhost环回地址。您的应用程序作为另一台计算机上的应用程序运行,即te模拟器。使用UWP时会有点混乱,因为 在本地计算机上作为应用程序运行。

这就是您必须使用托管服务器应用程序的计算机的网络地址的原因。此地址通常以192.168.x.x10.x.x.x开头,可在您计算机的网络设置中找到。

好像你已经发现了这一点。使用10.0.2.2地址时,您会收到HTTP 400.这意味着您的请求中的某些内容并不正确,但您可以从中得出结论,实际上可以访问服务器应用程序。但是请求的内容会导致服务器应用程序出现问题。由于您没有为/Account/Register端点提供任何代码,因此无法分辨出那里发生了什么。在服务器代码中放置一个断点,重试请求并尝试查看触发HTTP 400的原因。

答案 1 :(得分:0)

127.0.0.1是localhost;这是每台本地计算机的IP地址, 这意味着您尝试创建从Android应用到Android设备的请求

换句话说,您尝试连接Android设备,而不是计算机Localhost。

为此,您需要将计算机中的localhost从127.0.0.1更改为计算机的当前IP4。

现在尝试此扩展并按照说明在Visual Studio中执行此操作: https://marketplace.visualstudio.com/items?itemName=vs-publisher-1448185.ConveyorbyKeyoti