Xamarin 表单应用连接到 Asp.net 核心网络 Api

Xamarin forms app Connection to Asp.net core web Api

我有一个 xamarin 表单应用程序,它使用(本地)网络 api(使用 asp.net 核心)连接到 Sql 服务器数据库。 我尝试了此处提供的演示 https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client 来进行客户端 api 调用,但它使用控制台应用程序而不是移动应用程序并且运行良好。

同时使用 Microsoft.AspNet.WebApi.Client 和 Newtonsoft.Json Nuget 包

Xamarin 表单客户端代码

 client.BaseAddress = new Uri("http://myIP:port/");

            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));
            try
            {
                HttpResponseMessage response = await client.PostAsJsonAsync("api/users", user);
                response.EnsureSuccessStatusCode();
                return response.IsSuccessStatusCode;
            }
            catch (Exception ex)
            {

                Debug.WriteLine("Post Api Exception Msg: " + ex.Message, Class_Name);
                return false;
            }

和我的网络-Api代码

public IActionResult Post([FromBody] User user)
        {
        if(!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
    
    bool result= repository.Create(user);
    if(result)
    {
        return Ok();
    }
    else
    {
        return StatusCode(500);
    }
}

我已经测试了 api 代码,它工作正常。 但每当我尝试从我的 xamarin 应用程序拨打电话时

首先)我在网络中放置了一个断点-api 它永远不会被击中的代码

second) 我一直收到异常

[monodroid-net]   --- End of managed Java.Net.SocketException stack trace ---
[monodroid-net] java.net.SocketException: Socket closed
[monodroid-net]     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:394)
[monodroid-net]     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
[monodroid-net]     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
[monodroid-net]     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
[monodroid-net]     at java.net.Socket.connect(Socket.java:621)
[monodroid-net]     at com.android.okhttp.internal.Platform.connectSocket(Platform.java:145)
[monodroid-net]     at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:141)
[monodroid-net]     at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:112)
[monodroid-net]     at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:184)
[monodroid-net]     at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
[monodroid-net]     at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
[monodroid-net]     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
[monodroid-net]     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
[monodroid-net]     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
[monodroid-net]     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)

我认为这意味着连接套接字有问题,但我不知道问题是什么以及如何解决。

为了在 android 模拟器中访问您的位置机器的网络 API,您必须使用 IP 10.0.2.2,请参阅下面的 link 以获得帮助

https://developer.android.com/studio/run/emulator-networking#networkaddresses

你需要改变这个:

client.BaseAddress = new Uri("http://10.0.2.2:port/");

而不是:

client.BaseAddress = new Uri("http://myIP:port/");

更多信息参见官方文档: https://docs.microsoft.com/en-us/xamarin/cross-platform/deploy-test/connect-to-local-web-services

我终于通过使用 Conveyor Extension 解决了这个问题,步骤如下:

  1. 从工具栏扩展中打开 visual studio 和 select -> 管理扩展。

  2. 在在线部分搜索 Keyoti 的输送机。

  3. 安装扩展后重新启动您的 Visual studio 它将继续安装。

之后,您需要为 api 添加防火墙规则才能使用。

  1. 从开始菜单打开具有高级安全性的 windows Defender 防火墙,或在搜索框中输入任何适合您的内容 wf.mfc。

如需完整步骤,请观看此简短教程。 Conveyor:远程访问 IIS Express Web 应用程序 [更新]

除了通过互联网访问的部分进行所有防火墙配置后(因为在我的情况下,我的 api 和我的 android 设备都连接在同一网络上)

我没有工作所以我试了这个: 5) 单击工具 -> 传送带允许远程访问它将打开此 window 单击选项。

在最右侧的选项中,我单击了“防火墙检查”以检查防火墙是否存在任何问题

之后它将打开 window 显示防火墙问题 您将有两个选项自动应用防火墙规则或手动应用防火墙规则