如何从Android模拟器访问本地主机?

4
我正在学习这个教程中的Xamarin - 从Xamarin Forms注册用户到ASP.NET身份验证。如果我使用Postman发送请求,一切都正常。但是,如果我想使用Android模拟器,它就无法工作。我不能使用UWP,因为必须启用开发人员模式,而我没有公司计算机上的管理员权限。我在我的私人计算机上启用了开发人员模式,并且它在UWP上运行正常,但是在Android模拟器上无法工作。教程中使用了UWP,该人说Android模拟器需要一些配置,但他没有提供任何详细信息。
我阅读了很多文章,看起来问题在于我的后端(在本地主机上运行)和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 }}
2个回答

6

localhost 是指本地计算机。人们常犯的错误是认为 Android 模拟器(或者 iOS 模拟器)也属于 localhost 的一部分,因为它运行在同一台机器上。但实际上并非如此。

模拟器以设备的方式运行,并且会模仿物理设备的工作方式。它有自己的 IP 地址,无法访问你的 localhost 回环地址。你的应用程序在另一台机器上作为应用程序运行,即模拟器上。使用 UWP 时可能会有些困惑,因为这个应用程序确实是在你的本地机器上作为应用程序运行的。

这就是为什么你必须使用托管服务器应用程序的机器的网络地址。该地址通常以 192.168.x.x10.x.x.x 开头,并且可以在计算机的网络设置中找到。

看起来你已经发现了这一点。当使用 10.0.2.2 地址时,你会收到 HTTP 400 错误。这意味着你的请求中有些东西不对,但你可以得出结论:服务器应用程序实际上可以被访问到。但是请求的内容导致服务器应用程序出现问题。由于你没有提供 /Account/Register 端点的任何代码,因此无法确定其中出了什么问题。在服务器代码中设置断点,重试请求并尝试查看为什么会触发 HTTP 400。


1
我的请求是正确的。我必须使用这个地址192.168.x.x并以管理员身份运行Visual Studio。然后我必须进入applicationhost.config文件(在.vs文件夹中,而不是解决方案资源管理器中)- .vs/config/applicationhost.config。 - user8013875
1
我更改了这些行(49205是我的端口): <binding protocol="http" bindingInformation=":8080:localhost" /> 和 <binding protocol="http" bindingInformation="*:49205:localhost" />。有一行出现了3次,我不知道为什么,我必须将它们全部更改,有时它会再次创建这些行,所以我必须更改它。更改为: <binding protocol="http" bindingInformation=":8080:*" /> 和 <binding protocol="http" bindingInformation="*:49205:*" /> 现在它正在工作。 - user8013875

0

127.0.0.1 是本地主机的IP地址,也就是说你试图从Android应用程序向Android设备发出请求。

换句话说,你试图连接的是Android设备,而不是计算机localhost。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接