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 解决了这个问题,步骤如下:
从工具栏扩展中打开 visual studio 和 select -> 管理扩展。
在在线部分搜索 Keyoti 的输送机。
安装扩展后重新启动您的 Visual studio 它将继续安装。
之后,您需要为 api 添加防火墙规则才能使用。
- 从开始菜单打开具有高级安全性的 windows Defender 防火墙,或在搜索框中输入任何适合您的内容 wf.mfc。
如需完整步骤,请观看此简短教程。
Conveyor:远程访问 IIS Express Web 应用程序 [更新]
除了通过互联网访问的部分进行所有防火墙配置后(因为在我的情况下,我的 api 和我的 android 设备都连接在同一网络上)
我没有工作所以我试了这个:
5) 单击工具 -> 传送带允许远程访问它将打开此 window 单击选项。
在最右侧的选项中,我单击了“防火墙检查”以检查防火墙是否存在任何问题
之后它将打开 window 显示防火墙问题
您将有两个选项自动应用防火墙规则或手动应用防火墙规则
我有一个 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 解决了这个问题,步骤如下:
从工具栏扩展中打开 visual studio 和 select -> 管理扩展。
在在线部分搜索 Keyoti 的输送机。
安装扩展后重新启动您的 Visual studio 它将继续安装。
之后,您需要为 api 添加防火墙规则才能使用。
- 从开始菜单打开具有高级安全性的 windows Defender 防火墙,或在搜索框中输入任何适合您的内容 wf.mfc。
如需完整步骤,请观看此简短教程。 Conveyor:远程访问 IIS Express Web 应用程序 [更新]
除了通过互联网访问的部分进行所有防火墙配置后(因为在我的情况下,我的 api 和我的 android 设备都连接在同一网络上)
我没有工作所以我试了这个:
5) 单击工具 -> 传送带允许远程访问它将打开此 window 单击选项。
在最右侧的选项中,我单击了“防火墙检查”以检查防火墙是否存在任何问题
之后它将打开 window 显示防火墙问题 您将有两个选项自动应用防火墙规则或手动应用防火墙规则