远程连接到 .net 核心自托管网站 api
Remotely connect to .net core self hosted web api
我有一个简单的 .net 核心网站 api,只需一个操作:
[Route("[action]")]
public class APIController : Controller
{
// GET api/values
[HttpGet]
public string Ping()
{
return DateTime.Now.ToString();
}
}
如果我 运行 通过 dotnet 运行 我得到
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 results in a successful return of the current time. However going to a remote machine (same LAN) and trying to access the service via http://odin:5000/ping 会导致 404 错误。 (Odin 是机器的名称 运行 在控制台中通过 dotnet 运行 连接网络 api)。
服务器(和客户端!)防火墙都已关闭。我可以成功 ping "odin"。
任何想法我在这里缺少什么简单的步骤。我在家里和工作中都试过了,但都没有成功。
我的猜测是问题不在您的控制器中,而是在 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 不会在本地主机之外侦听。这是有道理的,因为在正常情况下,Kestrel 将位于 IIS 或 NGNIX 等反向代理后面,不需要绑定到外部 URL。
当本地机器上有多个可用 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();
}
您可以简单地执行以下操作来创建您的 WebHost,这将允许远程连接到 kestrel。
var host = WebHost.CreateDefaultBuilder(args)
.UseUrls("http://0.0.0.0:80")
.UseStartup<Startup>()
.Build();
使用以下代码后,我仍然无法远程访问我的 API,我不得不在 windows 控制面板中禁用由 Docker 创建的网络适配器(控制 Panel\Network 和 Internet\Network 连接)
解决此问题的另一种方法是编辑 "applicationhost.config" 文件。
在项目文件夹中 -> .vs(隐藏文件夹) -> 配置
打开 "applicationhost.config" 文件。在站点部分下,绑定节点中的站点名称="your project name" 添加另一个绑定并使用 "bindingInformation" 上的 "IP/Domain" 更改本地主机,如下所示:
<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 必须是 运行 管理员。
在我的例子中(.NET 核心 2.1)我必须修改 Properties/launchSettings.json
文件。
将 applicationUrl
设置为允许的 url 列表,像这样用分号分隔
"applicationUrl": "https://localhost:5001;http://odin:5000"
希望这对那里的人有所帮助。
最好的方法是调整位于 Properties
文件夹内的 launchSettings.json
。
改变
"applicationUrl": "https://localhost:5001"
到
"applicationUrl": "https://0.0.0.0:5001"
这允许 Kestrel Web 服务器侦听来自所有网络接口的流量。
对我们来说,它也是这样工作的(我不知道这是否是核心 3.1 的新功能):
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseKestrel();
webBuilder.UseIIS();
webBuilder.UseUrls("http://*:8080");
webBuilder.UseStartup<Startup>();
});
我有一个简单的 .net 核心网站 api,只需一个操作:
[Route("[action]")]
public class APIController : Controller
{
// GET api/values
[HttpGet]
public string Ping()
{
return DateTime.Now.ToString();
}
}
如果我 运行 通过 dotnet 运行 我得到
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 results in a successful return of the current time. However going to a remote machine (same LAN) and trying to access the service via http://odin:5000/ping 会导致 404 错误。 (Odin 是机器的名称 运行 在控制台中通过 dotnet 运行 连接网络 api)。
服务器(和客户端!)防火墙都已关闭。我可以成功 ping "odin"。
任何想法我在这里缺少什么简单的步骤。我在家里和工作中都试过了,但都没有成功。
我的猜测是问题不在您的控制器中,而是在 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 不会在本地主机之外侦听。这是有道理的,因为在正常情况下,Kestrel 将位于 IIS 或 NGNIX 等反向代理后面,不需要绑定到外部 URL。
当本地机器上有多个可用 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();
}
您可以简单地执行以下操作来创建您的 WebHost,这将允许远程连接到 kestrel。
var host = WebHost.CreateDefaultBuilder(args)
.UseUrls("http://0.0.0.0:80")
.UseStartup<Startup>()
.Build();
使用以下代码后,我仍然无法远程访问我的 API,我不得不在 windows 控制面板中禁用由 Docker 创建的网络适配器(控制 Panel\Network 和 Internet\Network 连接)
解决此问题的另一种方法是编辑 "applicationhost.config" 文件。 在项目文件夹中 -> .vs(隐藏文件夹) -> 配置 打开 "applicationhost.config" 文件。在站点部分下,绑定节点中的站点名称="your project name" 添加另一个绑定并使用 "bindingInformation" 上的 "IP/Domain" 更改本地主机,如下所示:
<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 必须是 运行 管理员。
在我的例子中(.NET 核心 2.1)我必须修改 Properties/launchSettings.json
文件。
将 applicationUrl
设置为允许的 url 列表,像这样用分号分隔
"applicationUrl": "https://localhost:5001;http://odin:5000"
希望这对那里的人有所帮助。
最好的方法是调整位于 Properties
文件夹内的 launchSettings.json
。
改变
"applicationUrl": "https://localhost:5001"
到
"applicationUrl": "https://0.0.0.0:5001"
这允许 Kestrel Web 服务器侦听来自所有网络接口的流量。
对我们来说,它也是这样工作的(我不知道这是否是核心 3.1 的新功能):
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseKestrel();
webBuilder.UseIIS();
webBuilder.UseUrls("http://*:8080");
webBuilder.UseStartup<Startup>();
});