【问题标题】:Xamarin: Connect to locally hosted web serviceXamarin:连接到本地托管的 Web 服务
【发布时间】:2015-06-30 07:02:23
【问题描述】:

我想创建一个 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:连接被拒绝

谁能帮忙。任何帮助表示赞赏。

【问题讨论】:

  • 看起来这与您的代码无关,您尝试访问的地址; http://localhost:49836 无法访问。你确定端口是正确的?服务器在监听吗?防火墙是否允许流量通过?当您在浏览器中输入该地址时,您会看到什么?
  • "localhost" 是指您正在运行的设备。如果你想连接到另一个系统,你需要使用它的唯一 IP 或名称,而不是 localhost。
  • 现在我有另一个问题:-- result = {StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Server: Microsoft-HTTPAPI/2.0 日期:2015 年 7 月 1 日星期三 05:57:12 GMT 连接:关闭 内容类型:文本/html; charset=us-ascii Content-Lengt...
  • 我需要帮助状态码:- 400,连接 web api 需要任何其他设置

标签: web-services xamarin xamarin.android


【解决方案1】:

如果您使用的是 Android 模拟器,那么请求 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 并将此 &lt;binding protocol="http" bindingInformation="*:13142:localhost" /&gt; 更改为 &lt;binding protocol="http" bindingInformation="*:13142:127.0.0.1" /&gt;,其中 13142 是我的端口,您的可能与众不同。重新启动 IIS Express,一切顺利。

【讨论】:

  • 经过数小时的搜索救了我。
  • 工作就像一个魅力!谢谢 。经过很长时间寻找富有成效的答案
【解决方案2】:

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

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

【讨论】:

  • @Ehsad Mirsaeedi 我希望你能给出一个更完整的答案,说明如何准确地做这些事情,以便每个人都可以使用它。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我解决了如何通过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"));              
                }
    

    【讨论】:

    • 现在我有另一个问题:-- result = {StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Server: Microsoft-HTTPAPI/2.0 日期:2015 年 7 月 1 日星期三 05:57:12 GMT 连接:关闭 内容类型:text/html; charset=us-ascii Content-Lengt...
    • 检查输入数据请求是否正确。例如。如果您有 json 数据,则不能: Content-Type: text / html。我通常首先尝试在 Fiddler2 中查询服务器,当我有正确的格式并且答案正常时,在目标应用程序中尝试相同的查询/url...
    • 顺便说一句,如果我对您的问题的回答是正确的/有用的,请不要忘记将其标记为已回答。
    【解决方案5】:

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

    127.0.0.1  mylocalmachine #this name can be any you want
    

    现在您可以使用此网址进行请求

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

    这是因为 localhost 在你的模拟器的上下文中,所以调用手机的 localhost。

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-04
        • 2017-10-20
        相关资源
        最近更新 更多