Xamarin:连接到本地托管的Web服务

问题描述 投票:15回答:6

我想创建一个web api应用程序来连接xamarin和android。 我已经尝试了很多,但一些连接错误即将到来。

我的代码如下:

public async Task<JsonValue> find(int ID)
    {
     using (HttpClient client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:49836");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            HttpResponseMessage result = client.GetAsync("api/Product").Result;
           return JsonConvert.DeserializeObject<JsonValue>(await result.Content.ReadAsStringAsync());                
     }       
    }
    }

我收到如下错误

System.Net.WebException:错误:ConnectFailure(连接被拒绝)---> System.Net.Sockets.SocketException:连接被拒绝

任何人都可以帮忙。任何帮助表示赞赏。

web-services xamarin xamarin.android
6个回答
25
投票

请注意,如果您的Web服务由IIS Express托管,那么您应该知道无法从外部设备连接到IIS Express,因为IIS Express本身只响应本地计算机的请求。所以从android模拟器作为外部(虚拟)设备,我们无法向IIS Express发送请求。解决方案是使用IIS而不是IIS Express。

  1. 使用IIS或配置IIS Express以服务于外部请求。
  2. 在Android模拟器中你不能使用'localhost',因为'localhost'是loopback并且是指Android模拟器。相反,您必须使用IIS的IP来解决您的Web服务。
  3. 配置系统的防火墙,以允许http请求进入。

23
投票

这个答案可能会有点晚,但对于那些需要它的人:如果您使用的是Android Emulator,那么要求localhost Web服务将无法工作,因为您正在查看模拟器的localhost。你怎么解决这个问题?好吧,Android Emulator有一个魔术地址http://10.0.2.2:your_port,它指向主机上的127.0.0.1:your_port。看看here。因为它指的是IP而不是localhost,你需要进入你的项目解决方案,在.vs文件夹 - > config-> applicationhost.config中并更改这个<binding protocol="http" bindingInformation="*:13142:localhost" />into <binding protocol="http" bindingInformation="*:13142:127.0.0.1" />,其中13142是我的端口,你的可能会有所不同。重新启动IIS Express,你很高兴。


2
投票

我解决了如何通过asp.net web api从服务器下载数据的问题,并开始我推荐简单的方法。

尝试使用完整地址,例如。

检查是否已打开数据连接。

确保你有正确的路径(例如,当你打开wifi时,它通过你的WebAPI服务器,所以不是完整的地址,而是本地服务器的地址)。

这是在我的情况下运行的简单代码(从简单开始再到下一步)

  using (WebClient webClient = new WebClient())
            {
                webClient.Encoding = System.Text.Encoding.UTF8;
                string result = webClient.DownloadString(new Uri("https://webapi.domain.cz/api/root"));              
            }

1
投票

我通过使用IP地址不使用localhost解决了这个问题


0
投票

尝试更改Hosts文件,将新主机名添加到127.0.0.1

127.0.0.1  mylocalmachine #this name can be any you want

现在您可以使用此URL请求

client.BaseAddress = new Uri("http://mylocalmachine:49836"); 

发生这种情况是因为localhost位于模拟器的上下文中,因此调用手机的localhost也是如此。

而不是使用主机名,你可以做Culy Ch的目标。


0
投票

如果您的Web服务由IIS托管,那么您将需要进行一些额外的设置以接受来自外部设备或服务器的请求。 (iOS模拟器,另一台开发者机器上的单独项目等)

为此,请遵循此Stack Overflow答案中的建议:How to enable external request in IIS Express?

© www.soinside.com 2019 - 2024. All rights reserved.