【问题标题】:Http Request throws 'Connection Refused' error from actual device on xamarineHttp 请求从 xamarin 上的实际设备引发“连接被拒绝”错误
【发布时间】:2020-10-21 13:06:50
【问题描述】:

我在实际设备上运行 xamarin 应用,并在发出 http 请求时收到 Connection Refused 错误。

注意:当我使用 emulator

时,http 请求有效

我尝试了以下作为基本 URL 地址: http://127.0.0.1:62597/ , http://localhost:62597/

我还添加了需要来自 android manifest 的互联网权限。解决方案-> 属性-> Android 清单选项卡。但是我注意到的一件事是,在设备上运行应用程序时,它不需要任何许可...... 我对此很陌生,因此非常感谢任何帮助。谢谢

这是 StackTrace:

at System.Net.Http.ConnectHelper.ConnectAsync (System.String host, System.Int32 port, System.Threading.CancellationToken cancellationToken) [0x00180] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/ConnectHelper.cs:84 
  at System.Threading.Tasks.ValueTask`1[TResult].get_Result () [0x0001b] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/Common/src/CoreLib/System/Threading/Tasks/ValueTask.cs:813 
  at System.Net.Http.HttpConnectionPool.CreateConnectionAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x000ea] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/HttpConnectionPool.cs:371 
  at System.Threading.Tasks.ValueTask`1[TResult].get_Result () [0x0001b] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/Common/src/CoreLib/System/Threading/Tasks/ValueTask.cs:813 
  at System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync (System.Threading.Tasks.ValueTask`1[TResult] creationTask) [0x000a2] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/HttpConnectionPool.cs:529 
  at System.Threading.Tasks.ValueTask`1[TResult].get_Result () [0x0001b] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/Common/src/CoreLib/System/Threading/Tasks/ValueTask.cs:813 
  at System.Net.Http.HttpConnectionPool.SendWithRetryAsync (System.Net.Http.HttpRequestMessage request, System.Boolean doRequestAuth, System.Threading.CancellationToken cancellationToken) [0x0003f] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/HttpConnectionPool.cs:284 
  at System.Net.Http.RedirectHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x00070] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/RedirectHandler.cs:32 
  at System.Net.Http.HttpClient.FinishSendAsyncBuffered (System.Threading.Tasks.Task`1[TResult] sendTask, System.Net.Http.HttpRequestMessage request, System.Threading.CancellationTokenSource cts, System.Boolean disposeCts) [0x0017e] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.Http/src/System/Net/Http/HttpClient.cs:506 
  at Artvertise.Services.RestHelperExtensions.MakeArtPost[TResponseModel] (Artvertise.Services.ArtClient client, System.String route, System.Object data, Artvertise.Services.ContentType contentType) [0x000c5] in C:\Users\agund\source\repos\Artvertise\Artvertise\Services\RestHelperExtensions.cs:82 

【问题讨论】:

  • localhost127.0.0.1 的别名,表示当前设备。设备请求设备,但您的​​ API 未在设备上运行(我认为)。 API 在哪里运行?在您的计算机上在 Visual Studio 中调试吗?
  • 使用机器的 IP 地址,而不是 127.0.0.1(环回)或 localhost。在某些机器上,localhost 设置为环回,而其他机器则设置为机器的 IP。所以从环回切换到本地主机会得到同样糟糕的结果。
  • webapp 和 xamarin 表单在同一个解决方案下,我右键单击主解决方案-> 属性并选择运行多个项目,然后选择 webapp 和 android。使用模拟器时,我只需将基本 url 更改为 10.0.2.2:62597
  • @jdweng 但是网络应用程序在本地主机上运行,​​你说“机器地址”是指什么?
  • 机器的IP地址。当客户端通过 Connect 方法使用环回地址 127.0.0.1 时,net 库会出错。

标签: c# rest xamarin httprequest


【解决方案1】:

当我使用模拟器时,http 请求有效

这是因为模拟器在桌面上运行并且使用与桌面相同的网络环境。当使用 localhost 而不是 127.0.0.1 时,它会自动找到 Web 服务器。

但是,在物理设备上运行时,它们的网络环境是不同的。您需要指定 Desktop 的 IP 地址。因此,如果使用模拟器的IP地址,也可以。如:https://192.168.1.15:62597/

解决步骤:

首先,您需要确保您的桌面和手机连接到同一个 WiFi(或任何其他本地网络),

然后使用路由器分配的桌面IP地址(不是localhost,也不是127.0.0.1) .

如何找出你桌面的IP地址:

  • 在命令行中输入ipconfig (Windows)
  • 会有一堆 IP
  • 尝试所有这些(除了前面提到的 localhost 和 127.0.0.1)

例如,下面的截图是我桌面的IP地址:

【讨论】:

  • 整晚都在困扰我,我的想法和你发布的一样。我认为你的解决方案会奏效。我会尽力让你知道的!谢谢
猜你喜欢
  • 2019-06-15
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 2021-06-07
相关资源
最近更新 更多