远程连接到 .net core 自托管 web api
Posted
技术标签:
【中文标题】远程连接到 .net core 自托管 web api【英文标题】:Remotely connect to .net core self hosted web api 【发布时间】:2017-02-05 12:50:31 【问题描述】:我有一个简单的 .net core web api,只需一个操作:
[Route("[action]")]
public class APIController : Controller
// GET api/values
[HttpGet]
public string Ping()
return DateTime.Now.ToString();
如果我通过 dotnet run 运行它,我会得到 p>
Hosting environment: Production
Content root path: C:\Users\xxx\Documents\Visual Studio 2015\Projects\SelfHostTest\src\SelfHostTest
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
转到浏览器并输入http://localhost:5000/ping 会成功返回当前时间。 但是 转到远程计算机(同一 LAN)并尝试通过 http://odin:5000/ping 访问服务会导致 404 错误。 (Odin 是通过 dotnet run 在控制台中运行 web api 的机器的名称。
服务器(和客户端!)防火墙均已关闭。我可以成功ping“odin”。
任何想法我在这里缺少什么简单的步骤。我在家里和工作中都试过了,但没有成功。
【问题讨论】:
如果您尝试使用“odin”的 IP 地址会发生什么?例如:192.111.11.2:5000?可能是this可以帮助你。 在服务器和客户端都尝试了同样的事情 192.168.1.2 。 127.0.0.1 可以在服务器上运行! 【参考方案1】:我的猜测是问题不在于您的控制器,而在于 program.cs。你需要修改你的WebHost的构造
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseUrls("http://localhost:5000", "http://odin:5000", "http://192.168.1.2:5000")
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
除非您添加 UseUrls 行,否则 Kestrel 不会在 localhost 之外进行侦听。这是有道理的,因为在正常情况下,Kestrel 将位于 IIS 或 NGNIX 等反向代理之后,并且不需要绑定到外部 URL。
【讨论】:
谢谢 - 这行得通!猜猜这种配置确实需要在某种配置文件中...? 或者你可以使用特殊的 ASPNETCORE_URLS 环境变量。不过,我不想在生产中直接听 Kestrel。最好把它放在别的东西后面。 此外,您可以使用.UseUrls("http://*:5000")
来接受来自端口5000
的任何传入请求!【参考方案2】:
最好的办法是调整launchSettings.json
,它位于Properties
文件夹内。
改变
"applicationUrl": "https://localhost:5001"
到
"applicationUrl": "https://0.0.0.0:5001"
这允许 Kestrel Web 服务器侦听来自所有网络接口的流量。
【讨论】:
asp.net core 3.1中有两个applicationUrl部分,我在哪里添加这部分? 您应该将此添加到您用于启动应用程序的任何配置文件中。【参考方案3】:您可以简单地执行以下操作来创建您的 WebHost,这将允许远程连接到 kestrel。
var host = WebHost.CreateDefaultBuilder(args)
.UseUrls("http://0.0.0.0:80")
.UseStartup<Startup>()
.Build();
使用以下代码后我仍然无法远程访问我的 API,我不得不在 windows 控制面板(控制面板\网络和 Internet\网络连接)中禁用 Docker 创建的网络适配器
【讨论】:
在program.cs文件中【参考方案4】:就我而言(.NET core 2.1)我必须修改Properties/launchSettings.json
文件。
将applicationUrl
设置为允许的 url 列表,用分号分隔,如下所示
"applicationUrl": "https://localhost:5001;http://odin:5000"
希望这对那里的人有所帮助。
【讨论】:
这对我来说适用于 .net core 3.1。请注意,它在指定 ip 地址时不起作用。【参考方案5】:解决此问题的另一种方法是编辑“applicationhost.config”文件。 在项目文件夹中-> .vs(隐藏文件夹)-> config 打开“applicationhost.config”文件。在站点部分下,绑定节点中的站点名称 =“您的项目名称”添加另一个绑定,并在“绑定信息”上使用您的“IP/域”更改本地主机,如下所示:
<site name="project_name" id="2">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="D:\Projects\project_directory" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:5000:localhost" />
<binding protocol="http" bindingInformation="*:5000:192.168.1.2" />
<binding protocol="http" bindingInformation="*:5000:odin" />
</bindings>
</site>
记住 Visual Studio 必须以管理员身份运行。
【讨论】:
是的“记住 Visual Studio 必须以管理员身份运行。”你不会像我一样愚蠢地浪费时间。 :)【参考方案6】:对我们来说,它也是这样工作的(我不知道这是否是核心 3.1 的新特性):
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
webBuilder.UseKestrel();
webBuilder.UseIIS();
webBuilder.UseUrls("http://*:8080");
webBuilder.UseStartup<Startup>();
);
【讨论】:
这工作得非常好:)【参考方案7】:当本地机器上有多个 IP 地址可用时,有一种更准确的方法。连接一个 UDP 套接字并读取其本地端点:
string localIP;
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
socket.Connect("8.8.8.8", 65530);
IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
localIP = endPoint.Address.ToString();
【讨论】:
以上是关于远程连接到 .net core 自托管 web api的主要内容,如果未能解决你的问题,请参考以下文章
.Net Core ClientWebSocket:无法连接到服务器
从家庭网络上的 grunt Web 服务器限制 http:// 连接到远程托管 Web 服务器的正确 CORS 条目是啥?
从 linux 的 dot net core 连接到远程 sql server 有时会失败,然后开始随机工作
将托管在 AWS EC2 上的 Asp.net Web api 连接到 AWS API Gateway